螺纹的替代方案是什么来克服UI冻结问题



我有两个线程在用户选择播放按钮时开始运行。但是当使用选择暂停或恢复按钮时,由于thread.join((。

以下是代码,我正在寻找一些克服这一点的替代方法。我已经尝试使用调用,但是即使使用这种方法也无法使用,我在调用线程方法时冻结了。

ThreadStart m_executeThreadStart;
        Thread m_executeThread;
        //user Selected Start Button
        private void Start()
        {
            m_executeThreadStart = new ThreadStart(method1);
            m_executeThread = new Thread(m_executeThreadStart);
            m_executeThread.Name = "ExecuteTestSession";
            m_executeThread.IsBackground = true;
            m_executeThread.Start();
            // Start the asynchronous operation.
            // InitializeBackgroundWorker();
            // backgroundWorker1.RunWorkerAsync();
            //Creating result sync thread
            ThreadStart m_resultSyncThreadStart = new ThreadStart(method2);
            Thread m_resultSyncThread = new Thread(m_resultSyncThreadStart);
            m_resultSyncThread.Name = "SyncResultDatabase";
            m_resultSyncThread.Start();
        }
        private void method1()
        {
            //do some work
            //read data from OPC sever (device)
        }
        private void method2()
        {
            //do some work
            //updated database accordingly method 1 data
        }
        //user Press Pause button
        public void Suspend()
        {
            //do work
            m_executeThread.Join();
            //do work
        }
        //user Press Resume button
        public void Resume()
        {
            //do work
            m_executeThread.Join();
            //do work
        }

您可以将事件处理程序添加到您的背景工人中,然后您不需要thread.join((。然后,您的活动处理程序可以在长期运行过程完成时执行必要的操作:

backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
     // code to run after long running process has completed
}

ASYNC/等待模式旨在阻止UI冻结(正确实现(您可以将其用作替代方法-https://learn.microsoft.com/en-us/dotnet/csharp/csharp/ashasync

另请参阅:https://learn.microsoft.com/en-us/windows/uwp/uwp/debug-test-perf/keep-the-ui-thread-responsive

我创建了解决方案,以下是答案的链接。

如何暂停/暂停线程然后继续?

ManualResetEvent mrse = new ManualResetEvent(true);    
 ThreadStart m_executeThreadStart;
        Thread m_executeThread;
        //user Selected Start Button
        private void Start()
        {
            m_executeThreadStart = new ThreadStart(method1);
            m_executeThread = new Thread(m_executeThreadStart);
            m_executeThread.Name = "ExecuteTestSession";
            m_executeThread.IsBackground = true;
            m_executeThread.Start();
            // Start the asynchronous operation.
            // InitializeBackgroundWorker();
            // backgroundWorker1.RunWorkerAsync();
            //Creating result sync thread
            ThreadStart m_resultSyncThreadStart = new ThreadStart(method2);
            Thread m_resultSyncThread = new Thread(m_resultSyncThreadStart);
            m_resultSyncThread.Name = "SyncResultDatabase";
            m_resultSyncThread.Start();
        }
        private void method1()
        {
            //do some work
            //read data from OPC sever (device)
              mrse.WaitOne();
        }
        private void method2()
        {
            //do some work
            //updated database accordingly method 1 data
              mrse.WaitOne();
        }
        //user Press Pause button
        public void Suspend()
        {
            //do work
            mrse.Reset();
            //do work
        }
        //user Press Resume button
        public void Resume()
        {
            //do work
             mrse.Set();
            //do work
        }

感谢您的帮助。

最新更新