C# 背景 worker

标签 c# windows-phone-7 backgroundworker

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

当我获得信息时,我会解析它并将项目添加到 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/

相关文章:

c# - 如何为 MTM 套件或计划设置来自测试经理或 Team Foundation Server 的通知?

c# - 在 .NET/C# 中完成事件后运行操作

c# - 如何实现winform session ,尤其是 session 超时

windows-phone-7 - WebBrowser 控件导航返回

datagridview - "Streaming"结果从BackgroundWorker到DataGridView

c# - NHibernate 聚合子查询

windows-phone-7 - Windows Phone 7 和 native C++/CLI

xaml - 如何更改 Windows Phone 7 中进度指示器的颜色

VB.NET 委托(delegate)和调用 - 有人可以向我解释这些吗?

c# - 进度条和文件加载