【问题标题】:How to stop a BackgroundWorker externally如何在外部停止 BackgroundWorker
【发布时间】:2014-01-31 23:25:08
【问题描述】:

我的客户端应用程序中有一个BackgroundWorker_DoWork 方法,该方法使用 NetworkComms.Net 将 tcp 消息发送到服务器并检查答案。

最后一部分的方法是 NetworkComms.AppendGlobalIncomingPacketHandler 我可以在其中验证答案是否具有某种类型,如果是,则调用另一种方法来处理答案消息本身。

我想做的是从处理程序中停止 BackgroundWorker,但我不知道如何。非常感谢任何帮助,因为我是面向对象编程的新手,我可能缺少一些基本的东西。

以下是相关代码:

private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{

    if (backgroundWorker2.CancellationPending)
    {
        e.Cancel = true;
        return;
    }

    string serverIP = entr_serverIP.Text;

    int serverPORT;
    int.TryParse(entr_serverPORT.Text, out serverPORT);
    bool loop = true;

    while (loop == true)
    {
        if (backgroundWorker2.CancellationPending)
        {
            e.Cancel = true;
            return;
        }

        try
        {
            NetworkComms.SendObject("Message", serverIP, serverPORT, "status");

            NetworkComms.AppendGlobalIncomingPacketHandler<string>("ReturnHere", DoSomething2);


        }
        catch(DPSBase.CommsException ex2)
        {
            MessageBox.Show(ex2.ToString());

            e.Cancel = true;
            return;

        }


        Thread.Sleep(100);

    }

}


private static void DoSomething2(PacketHeader header, Connection connection, string message)
{
    bool svAlarmSent = false;
    while (svAlarmSent == false)
    {
        if (message == "KEYWORD")
        {
            string svInfo = connection.ConnectionInfo.RemoteEndPoint.ToString();

            Form4 form4 = new Form4("KEYWORD", null, svInfo);
            form4.Show();
            svAlarmSent = true;


            backgroundWorker2.CancelAsync();
            loop = false;


        }

    }

}   

上述代码的最后两行不起作用,因为CancelAsync 方法和loop 变量在该上下文中不存在。

【问题讨论】:

    标签: c# oop backgroundworker networkcomms.net


    【解决方案1】:

    解决此问题的第一步是启用 DoSomething2 方法的取消。为此,它需要访问backgroundWorker2 变量。这是一个字段(属性),因此您可以通过将方法设为非静态来授予它访问权限:

    private void DoSomething2(PacketHeader header, Connection connection, string message)
    

    下一步是简单地从DoSomething2 中删除对loop 值的访问。此方法的职责是仅发出取消信号。 backgroundWorker2_DoWork 方法的工作就是响应这个取消。

    事实上,loop 变量甚至不需要设置。一旦CancelAsync 被调用,将满足以下条件:

    if (backgroundWorker2.CancellationPending)
    {
        e.Cancel = true;
        return;
    }
    

    由于返回此代码将自行打破while 循环。

    总的来说,我想说这并不是BackgroundWorker 的真正预期用途。取消应该用于允许用户或某些操作指示后台任务应该取消工作并在未完成的情况下返回(如果可能)。在这种情况下,您使用取消来表示代码成功完成。这可行,但有点意外用例。

    【讨论】:

      【解决方案2】:

      我不确定你到底在问什么,但这里有一个如何处理后台工作人员的简单示例。

          private readonly bool _shouldStop;
      
          public void Start()
          {
              Thread workerThread = new Thread(DoWork);
              workerThread.IsBackground = true;
              workerThread.Start();
          }
      
          public void DoWork()
          {            
              while (!_shouldStop)
              {
      
                  //work
              }
          }
          public void RequestStop()
          {
              _shouldStop = true;
          }
      

      启动worker只需调用Start()并停止它调用RequestStop() http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

      【讨论】:

      • 这个问题专门针对BackgroundWorker类型
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-21
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多