我有一个按钮,在单击事件时,我会从网络中获取一些信息。
当我得到信息时,我会解析它并将项目添加到 ListBox。一切都很好,但是当我快速双击按钮时,似乎有两个后台工作人员正在运行,完成所有工作后,列表中的项目被复制。
我想这样做,如果您单击按钮并且获取信息的过程正在进行中,则该线程正在停止,并且只有在第一个工作完成后,第二个工作才开始。
是的,我知道 AutoResetEvent,但是当我使用它时,它只帮了我一次,而且再也没有了。我无法实施这种情况,希望您能帮助我!
现在我什至尝试简化但没有成功:(:我添加了一个标志字段(RefreshDialogs)(默认为false),当用户点击按钮时,如果标志为真(这意味着工作正在做),什么都没有做,但是当flag字段设置为false时,一切都很好,我们开始一个新的进程。
当后台工作完成时,我将字段标志更改为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;
}