c#wpf线程没有正确终止
我的问题是我需要一个线程在Serialports上进行操作。 我实现了一个从其他对象调用方法的工作类来读取串行端口的值。当私有volatile属性为真时,线程应该这样做。如果它设置为false,则循环停止。在循环中,我提出了一个事件来将eventargs传递给GUI,以便它可以被更新。在我的WPF GUI中,我正在捕获事件并处理事件,当工作伙伴仍在工作时(另一个volatile属性)。c#wpf线程没有正确终止
当我不在工人类中触发事件时,一切都正常工作。 但是,当我触发事件的线程是不会停止的状态,有时(并不总是)
工人代码:
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:
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线程安全?我也试过监视器,以防止其他代码再次调用workerthread函数... 先谢谢你,马克!
感谢您的快速回复!
不,这不是我想要的,而是试图阻止在事件处理程序中执行GUI代码,因为Thread.Join()在尝试执行GUI代码时不起作用。所以我从来没有停过的线程。
将_continue标志传递给eventargs时,我现在可以阻止执行GUI代码。这工作到现在好。
void worker_ProgressChanged(object sender, M5.Objects.Dispenser.ProgressChangedArgs e)
{
if (e.StopUI)
{
return;
}
但是对于感兴趣,您是否意味着清除属性?它是否设置为空?
但是当我火线程是不会停止的状态,有时(并不总是)
啊,又爱在一些额外否定投掷事件。如果我正确理解了您的代码,请在您的worker_ProcessChanged
事件处理程序中,您正在等待线程关闭(MyWorker.Continue
变为false)。那真的是你想要的吗?据我所知,您并未在任何地方清除Continue
或_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
}
如果不是这样,那么再次重复您的问题并更清楚地说出它可能会是谨慎的。
至少我找到了一个可以正常工作的方法:我将continuearg和eventargs一起传递,并在继续为false时阻止执行gui代码。 – 2011-02-17 11:24:36