从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;
}
}
答案 0 :(得分:0)
这些行:
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
必须在之前移动:
worker.RunWorkerAsync();
他们在错误的地方。
此外,您无法在m_currentworker.CancelAsync();
处理程序中使用DoWork
;必须从你想要停止工人的地方调用它。此外,在RunModels(worker, e);
中,您必须检查worker.CancellationPending
并在此标志设置为true时停止。
实际发生的是当您致电CancelAsync();
时,标志CancellationPending
设置为true。你的工作是尽快从DoWork(...)
返回。