c#wpf线程未正确终止

c#wpf线程未正确终止,c#,wpf,multithreading,C#,Wpf,Multithreading,我的问题是,我需要一个线程在串行端口上执行操作。 我实现了一个worker类,它从其他对象调用方法来读取串行端口的值。当私有volatile属性为true时,线程应该这样做。如果设置为false,则循环停止。在循环中,我引发一个事件,将eventargs传递给GUI,以便对其进行更新。在我的WPF GUI中,我捕获事件并处理eventargs,此时workers属性仍在工作(另一个volatile属性) 当我没有在worker类中触发事件时,线程的一切都正常工作。 但当我触发事件时,线程有时(并

我的问题是,我需要一个线程在串行端口上执行操作。 我实现了一个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代码。。。