我有一个Windows服务使用Thread和SemaphoreSlim每60秒执行一些"工作".
class Daemon
{
private SemaphoreSlim _semaphore;
private Thread _thread;
public void Stop()
{
_semaphore.Release();
_thread.Join();
}
public void Start()
{
_semaphore = new SemaphoreSlim(0);
_thread = new Thread(DoWork);
_thread.Start();
}
private void DoWork()
{
while (true)
{
// Do some work here
// Wait for 60 seconds, or exit if the Semaphore is released
if (_semaphore.Wait(60 * 1000))
{
return;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想从中调用异步方法DoWork.为了使用await我必须添加async到的关键字DoWork:
private async void DoWork()
Run Code Online (Sandbox Code Playgroud)
你可以做到这一点,但这不是一个好主意.一旦第一次await点击没有同步完成,其余的工作将在一个延续时完成,而不是你开始的线程(_thread); 你开始的线程将在第一个终止await.无法保证延续将返回到原始线程,并且在您的方案中,它不能 - 该线程现在是吐司.这意味着:
_thread没有意义,也不代表行动的状态; 因此,你的Stop()方法与_thread.Join();你没有做你期望它做的事情通过使用Task.Run启动此类操作可以避免这两个问题.