线程重新创建后,EventHandler不会触发

时间:2014-11-04 12:47:13

标签: c# multithreading event-handling

从UI线程,我使用backgroundworker创建另一个线程。在这个帖子中 我正在使用NetworkChanged事件处理程序。一旦连接丢失,我DoWorkEventArgs e.Cancel,关闭线程。 一旦网络重新连接,我使用相同的后台工作重启线程。 但是,从这一点开始,事件处理程序将不再触发断开连接或重新连接网络。

eventhandler的代码位于使用初始后台工作程序启动的Test类中。

    public Test()
    {
        NetworkChange.NetworkAvailabilityChanged +=
            new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged);
    }

    protected virtual void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e)
    {
        try
        {
            if (e.IsAvailable)
            {
               IsConnectionActive = true;
               //recreate thread
            }
            else
            {
               IsConnectionActive = false;
               //Close thread
            }
        }
        catch
        {
        }
    }

我已经读过某些事件不是线程安全的,但我不明白其他例子我需要改变什么才能做到这一点。 (如果这就是问题) 我犯的错误是什么,以及如何解决这个问题?

非常感谢。

编辑:

做工作代码:

 private void backgroundWorker_DoWork(object sender,
        DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        worker.WorkerReportsProgress = true;
        worker.WorkerSupportsCancellation = true;

        RunModels(worker, e);       
    }

取消DoWork的代码:

    public void ModelsConnectionChanged(bool sender)
    {
        try
        {
            if (sender == false)
            {
                m_currentworker.ReportProgress(0, "DISCONNECT");
                m_currentworker.CancelAsync();
                DoWork.Cancel = true;
            }
        }
        catch (Exception e)
        {
            throw e;
        }
    }

1 个答案:

答案 0 :(得分:0)

这些行:

worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;

必须在之前移动:

worker.RunWorkerAsync();

他们在错误的地方。 此外,您无法在m_currentworker.CancelAsync();处理程序中使用DoWork;必须从你想要停止工人的地方调用它。此外,在RunModels(worker, e);中,您必须检查worker.CancellationPending并在此标志设置为true时停止。

实际发生的是当您致电CancelAsync();时,标志CancellationPending设置为true。你的工作是尽快从DoWork(...)返回。