我有两个线程在用户选择播放按钮时开始运行。但是当使用选择暂停或恢复按钮时,由于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
}
感谢您的帮助。