Wib*_*ble 5 .net c# methods multithreading
我有一个XAML表单,我希望从主XAML执行线程中穿出两个独立的功能:1.)一个计时器控件,它会勾选,以及2.)实现一个暂停按钮,这样我就可以冻结一组程序性的活动再次单击暂停按钮将恢复.
当我启动表单时,整个应用程序冻结.因此,我无法与btnPause控件进行交互.我让计时器类工作,但它(lblTimer)以块的形式更新,或者当它看起来CPU在主线程上不忙时.
我试图创建一个类"任务",它在自己的线程中包装一个类或方法,以便我可以控制.
Automation.Task AutomationThread = new Automation.Task();
Automation.Task TimerThread = new Automation.Task();
Run Code Online (Sandbox Code Playgroud)
后来,我尝试创建一个秒表类并为其分配TimerThread,以便我可以独立管理它.
Automation.WatchTimer stopwatch = new Automation.WatchTimer(lblTimer, TimerThread);
class Task
{
private ManualResetEvent _shutdownFlag = new ManualResetEvent(false);
private ManualResetEvent _pauseFlag = new ManualResetEvent(true);
Thread _thread;
public Task() { }
public void Start()
{
_thread = new Thread(DoWork);
_thread.Start();
}
public void Resume()
{
_pauseFlag.Set();
}
public void Stop()
{
_shutdownFlag.Set();
_pauseFlag.Set();
_thread.Join();
}
public void DoWork()
{
do
{
_pauseFlag.WaitOne(Timeout.Infinite);
}
while (!_shutdownFlag.WaitOne(0));
}
// I AM NOT SURE IF THIS IS THE RIGHT APPROACH
public void DoWork(Func<void> method????)
{
do
{
// NOT SURE WHAT TO PUT HERE
// This is where I want it to do a method
// that wraps a long chain of procedural items
// where I can pause (block) and unpause through the UI
}
while (!_shutdownFlag.WaitOne(0));
}
class WatchTimer
{
public WatchTimer(System.Windows.Controls.Label lbl, Automation.Task worker)
{
lblField = lbl;
worker.Start();
}
private System.Windows.Controls.Label lblField;
Timer time = new Timer();
Stopwatch sw = new Stopwatch();
public void Start()
{
time.Start();
sw.Start();
time.Tick += new EventHandler(time_Tick);
}
public void Stop()
{
time.Stop();
sw.Stop();
}
public void Reset()
{
sw.Reset();
lblField.Content = this.elapsedTime();
}
public string elapsedTime()
{
TimeSpan ts = sw.Elapsed;
// return formatted TimeSpan value
return String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
}
private void time_Tick(object sender, EventArgs e)
{
lblField.Content = this.elapsedTime();
}
}
Run Code Online (Sandbox Code Playgroud)
计时器似乎工作,但它仍然以块的形式吐出更新 - 这是否意味着它不在自己的线程上?
明显的挂起是因为一个 CPU 固定在 100% 造成的。这是因为 的初始状态_pauseFlag被设置为有信号。因此,当主线程调用 时new Thread(DoWork),DoWork会不断地越过_pauseFlag.WaitOne并在紧密do/while循环中运行。
将某些方法包装在线程中并暂停,这是可行的。您必须do/while从DoWork方法中删除 。因此,您的顺序代码DoWork必须经常检查子任务、内部循环或顺序工作方法中的任何内容之间的暂停事件信号状态。