c#wpf线程未正确终止
我的问题是,我需要一个线程在串行端口上执行操作。 我实现了一个worker类,它从其他对象调用方法来读取串行端口的值。当私有volatile属性为true时,线程应该这样做。如果设置为false,则循环停止。在循环中,我引发一个事件,将eventargs传递给GUI,以便对其进行更新。在我的WPF GUI中,我捕获事件并处理eventargs,此时workers属性仍在工作(另一个volatile属性) 当我没有在worker类中触发事件时,线程的一切都正常工作。 但当我触发事件时,线程有时(并非总是)不会处于停止状态 工人代码:c#wpf线程未正确终止,c#,wpf,multithreading,C#,Wpf,Multithreading,我的问题是,我需要一个线程在串行端口上执行操作。 我实现了一个worker类,它从其他对象调用方法来读取串行端口的值。当私有volatile属性为true时,线程应该这样做。如果设置为false,则循环停止。在循环中,我引发一个事件,将eventargs传递给GUI,以便对其进行更新。在我的WPF GUI中,我捕获事件并处理eventargs,此时workers属性仍在工作(另一个volatile属性) 当我没有在worker类中触发事件时,线程的一切都正常工作。 但当我触发事件时,线程有时(并
public void StartWork()
{
int i = 0;
while (this._continue)
{
this.StillRunning = true;
try
{
if (measureDispesner)
{
Dispenser.GetStatus();
}
if (MeasureScale)
{
Dispenser.Scale.Weigh();
}
OnProgressChanged(new ProgressChangedArgs(Dispenser, Dispenser.Scale));
Console.WriteLine("Executed measuring " + i++.ToString() + " ScaleWeight: " + Dispenser.Scale.Status.CurrentStableWeight.ToString());
}
catch (Exception e)
{
//throw e.InnerException;
}
finally
{
// System.Threading.Monitor.Exit(this);
}
}
Console.WriteLine("Stopped after: " + i++.ToString());
this.StillRunning = false;
}
WPF GUI中的Eventhandler:
void worker_ProgressChanged(object sender, M5.Objects.Dispenser.ProgressChangedArgs e)
{
M5.Objects.Dispenser.Worker MyWorker = (M5.Objects.Dispenser.Worker)sender;
while (MyWorker.Continue)
{
// Wait while the worker is still running - code angs here
//return;
}
System.IO.MemoryStream ms;// = M5.Support.ResourceManager.ResMan.ConvertImageToMemoryStream(M5.Support.ResourceManager.ResMan.BottleImage);
if (this.objDispenser.IsAvalaible)
{
this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)delegate()
{
this.txtComPort.Text = e.DispenserPort;
this.lblDispenserStatus_Dispenser.Content = e.DispenserMedikament;
我做错了什么?!如何更新GUI threadsafe?我还尝试监视以防止其他代码再次调用workerthread函数。。。
事先谢谢你,马克
谢谢你的快速回复 不,这并不是我真正想要的,而是试图阻止在eventhandler中执行GUI代码,因为Thread.Join()在尝试执行GUI代码时不起作用。所以我从来没有停过线 当用eventargs传递_continue标志时,我现在可以阻止执行GUI代码。到目前为止,效果还不错
void worker_ProgressChanged(object sender, M5.Objects.Dispenser.ProgressChangedArgs e)
{
if (e.StopUI)
{
return;
}
但是对于兴趣来说,清除属性意味着什么?是否必须在任何位置将其设置为null
但当我触发事件时,线程有时(并非总是)不会处于停止状态
啊,我喜欢多加一些否定。如果我正确理解了代码,则在worker\u ProcessChanged
事件处理程序中,您正在等待线程关闭(MyWorker.Continue
变为false)。这真的是你想要的吗?据我所知,您没有在任何地方清除Continue
或\u Continue
也许您希望在事件处理程序中使用与此类似的内容
void worker_ProgressChanged(object sender, M5.Objects.Dispenser.ProgressChangedArgs e)
{
M5.Objects.Dispenser.Worker MyWorker = (M5.Objects.Dispenser.Worker)sender;
MyWorker.Continue = false;
while (MyWorker.StillRunning)
{
// Wait here...
}
// Do something else
}
如果没有,最好下次再仔细检查您的问题,并将其表达得更清楚。至少我找到了一种工作正常的方法:我用eventargs传递continue falg,并防止在continue为false时执行gui代码。。。