【发布时间】:2019-04-18 11:07:35
【问题描述】:
假设我有一个工人阶级。
public sealed class Worker : IDisposable
{
private bool _isRunning;
private CancellationTokenSource _cts;
private readonly Action _action;
private readonly int _millisecondsDelay;
private readonly object _lock = new object();
public Worker(Action action, int millisecondsDelay)
{
_action = action;
_millisecondsDelay = millisecondsDelay = 5000;
}
public void Start()
{
lock (_lock)
{
if (!_isRunning)
{
_isRunning = true;
Run();
}
}
}
public void Cancel()
{
lock (_lock)
{
if (_isRunning) _cts.Cancel();
}
}
private void Run()
{
using (_cts) _cts = new CancellationTokenSource();
Task.Run(async () => { await DoAsync(_cts.Token); });
}
private async Task DoAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
//Log.Message1("____REFRESHING STATUS____");
_action();
await Task.Delay(_millisecondsDelay, cancellationToken);
}
//this code is unreachable
lock (_lock)
{
_isRunning = false;
}
}
public void Dispose()
{
try
{
_cts?.Cancel();
}
finally
{
if (_cts != null)
{
_cts.Dispose();
_cts = null;
}
}
}
}
问题是代码_isRunning = false; 无法访问。我的意思是当调用者调用Cancel 方法时,工作人员更有可能等待Task.Delay。那么在我的任务被取消之后,我怎么能打电话给 smth(这里是 _isRunning = false;)?换句话说,我需要确保我的工人没有运行(它不是取消状态)
【问题讨论】:
-
这适用于 ASP.NET、ASP.NET Core、WPF 还是其他特定平台?其中一些为具有启动/停止功能的后台任务/进程提供了特定的方法。
-
@FireLancer 适用于 wpf 平台
-
DispatcherTimer可能是相关的,如果您想从计时器访问 UI。 -
可能是,但我根本不喜欢使用计时器
标签: c# .net async-await task-parallel-library