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 
} 

如果不是这样,那么再次重复您的问题并更清楚地说出它可能会是谨慎的。

+0

至少我找到了一个可以正常工作的方法:我将continuearg和eventargs一起传递,并在继续为false时阻止执行gui代码。 – 2011-02-17 11:24:36