gpt4 book ai didi

C# 背景 worker

转载 作者:太空狗 更新时间:2023-10-30 01:23:05 25 4
gpt4 key购买 nike

我有一个按钮,在单击事件时我从网络获取一些信息。

当我获得信息时,我会解析它并将项目添加到 ListBox。一切都很好,但是当我快速双击按钮时,似乎有两个后台工作人员正在运行,并且在完成所有工作后,列表中的项目被复制。

我想这样做,如果您单击按钮并且正在获取信息,则该线程将停止,只有在第一项工作完成后,第二项工作才会开始。
是的,我知道 AutoResetEvent,但当我使用它时,它只帮了我一次,再也没有帮过我。我无法实现这种情况,希望您能帮助我!

现在我什至尝试更简单但没有成功 :( :( : 我添加了一个标志字段(RefreshDialogs)(默认为 false),当用户单击按钮时,如果标志为真(这意味着工作正在进行),什么都没有正在做,但是当标志字段设置为 false 时,一切都很好,我们开始一个新的过程。
当 Backgroundwork 完成时,我将字段标志更改为 false(这意味着用户可以运行新进程)。

    private void Message_Refresh_Click(object sender, EventArgs e)
{
if (!RefreshDialogs)
{
RefreshDialogs = true;
if (threadBackgroundDialogs.WorkerSupportsCancellation)
{
threadBackgroundDialogs.CancelAsync();
}
if (!threadBackgroundDialogs.IsBusy)
{
downloadedDialogs = 0;
threadBackgroundDialogs = new BackgroundWorker();
threadBackgroundDialogs.WorkerSupportsCancellation = true;
threadBackgroundDialogs.DoWork += LoadDialogs;
threadBackgroundDialogs.RunWorkerCompleted += ProcessCompleted;
threadBackgroundDialogs.RunWorkerAsync();
}
}
}
void ProcessCompleted(object sender, RunWorkerCompletedEventArgs e)
{
RefreshDialogs = false;
}

最佳答案

所以你想让第二个进程在第一个进程运行时保持运行,但它们不应该互相干扰?第一个完成后第二个继续吗?

粗略的方式:While循环:

        if (!RefreshDialogs)
{
RefreshDialogs = true;

这变成了:

    while(RefreshDialogs)
{
}
RefreshDialogs = true;

将其设置为 false 后,第二个进程将跳出 while。 (请注意,这是非常低效的,因为两个进程都将一直运行,我很确定第二个进程会阻止第一个进程,但是现在多任务处理不应该,如果它阻止使用 Dispatcher.Thread)

优雅的方式:使用信号量

http://msdn.microsoft.com/de-de/library/system.threading.semaphore%28v=vs.80%29.aspx

如果您发现不可能同时运行两个进程,或者想要其他方式:添加一个 Array/List/int,当第二个进程注意到第一个进程正在运行时,就像你的 bool 一样,增加你的 Added 变量,并在进程结束时,重新启动新进程并减少变量:

    int number;

if (!RefreshDialogs)
{
RefreshDialogs = true;
your code;
if(number > 0)
{
number--;
restart process
}
}
else
{
number++;
}

我不得不承认,我最喜欢我的最后一个建议,因为它非常有效。

关于C# 背景 worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12138830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com