2

我的客户端应用程序中有一个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

4

2 回答 2

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自行打破循环。

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

于 2014-01-31T23:37:55.300 回答
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;
    }

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

于 2014-01-31T23:33:08.223 回答