我的问题是我需要一个在Serialports上进行操作的线程。 我实现了一个工作类,它调用其他对象的方法来读取串口的值。私有volatile属性为true时,线程应该这样做。如果设置为false,则循环停止。在循环中,我引发一个事件以将eventargs传递给GUI,以便可以更新它。在我的WPF GUI中,我正在捕获事件并处理eventargs,当worker attribue仍在工作时(另一个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线程安全?我也试过Monitor以防止其他代码再次调用workerthread函数... 提前谢谢你,Marc!
感谢您的快速回复!
不,这不是我想要的,但是尝试阻止在事件处理程序中执行GUI代码,因为Thread.Join()在尝试执行GUI代码时不起作用。所以我从来没有停止过线程。
当使用eventargs传递_continue标志时,我现在可以阻止执行GUI代码。到目前为止工作正常。
void worker_ProgressChanged(object sender, M5.Objects.Dispenser.ProgressChangedArgs e)
{
if (e.StopUI)
{
return;
}
但是为了兴趣,清除属性是什么意思?它可以在任何地方设置为null吗?
答案 0 :(得分:0)
啊,爱上了几个额外的否定。如果我正确理解您的代码,则在但是当我触发事件时,线程有时不会停止状态(并不总是)
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
}
如果没有,再次审问你的问题可能是谨慎的,并且更清楚地说出来。