gpt4 book ai didi

c# - 如何从外部停止 BackgroundWorker

转载 作者:行者123 更新时间:2023-11-30 20:51:38 27 4
gpt4 key购买 nike

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

最佳答案

解决此问题的第一步是从 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 的真正用途。取消应该用于允许用户或某些操作发出信号,表明后台任务应该取消工作并返回而不完成(如果可能)。在这种情况下,您使用取消来表示代码已成功完成。这可行,但在某种程度上是一个意想不到的用例。

关于c# - 如何从外部停止 BackgroundWorker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21491938/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com