c#wpf线程未正确终止

时间:2011-02-17 10:11:33

标签: c# wpf multithreading

我的问题是我需要一个在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吗?

1 个答案:

答案 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
}

如果没有,再次审问你的问题可能是谨慎的,并且更清楚地说出来。