今天在调试程序遇到一个场景,死锁是必现的,就在在关闭ActionBlock的时候出现的,代码如下:
static async void Tt()
{
var rsp =await CloseTt().ConfigureAwait(false);
Console.WriteLine("threadid = {0} enter close", Thread.CurrentThread.ManagedThreadId);
rsp.Complete();
rsp.Completion.Wait();
Console.WriteLine(" close end");
}
static Task<ActionBlock<Action>> CloseTt()
{
TaskCompletionSource<ActionBlock<Action>> _TaskComple = new TaskCompletionSource<ActionBlock<Action>>();
ActionBlock<Action> actionBlock = new ActionBlock<Action>((d) =>
{
d.Invoke();
});
actionBlock.Post(() =>
{
Console.WriteLine("threadid = {0} SetResult ", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000);
_TaskComple.SetResult(actionBlock);
});
return _TaskComple.Task;
}
输出如下:
我居然发现线程ID是一样的,也就是说,当在一个线程内部,使用setresult通知已经完成之后,居然通过异步返回的也是这个线程的结果,然后我还在傻傻的执行关闭,等于想在一个线程内部自己关闭自己,结果当然就卡主了。