如何从外部停止BackgroundWorker

时间:2014-01-31 23:25:09

标签: c# oop backgroundworker networkcomms.net

我的客户端应用程序中有一个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变量在该上下文中不存在。

2 个答案:

答案 0 :(得分:4)

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

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

下一步是从loop简单删除DoSomething2值的访问权限。此方法的责任是仅发出取消信号。 backgroundWorker2_DoWork方法的工作是响应此取消。

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

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

通过返回此代码将自行打破while循环。

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

答案 1 :(得分:0)

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

    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