首先,我将解释我要做什么。
我有一个组件 A正在使用组件 B。
为了在它们之间进行通信,我需要使用 event.
我的先决条件之一是让组件 B异步运行并按它们被调用的顺序运行事件处理程序。
此外,我想取消呼叫管道(当用户询问时)。因此,所有尚未执行的事件处理程序都将永远不会执行。
实现上的解决方案是TPL。我对我正在尝试做的事情做了一个 POC:
static void Main(string[] args)
{
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
var t = Task.Factory.StartNew(() => DoSomeWork(token));
//.ContinueWith((prevTask) => DoSomeWork(token));
t.ContinueWith((prevTask) => DoSomeWork(token));
Task.WaitAll(t);
Console.WriteLine("Finish");
Console.ReadKey();
}
static int id = 1;
static void DoSomeWork(CancellationToken ct)
{
ct.ThrowIfCancellationRequested();
Thread.Sleep(1000);
Console.WriteLine(id++);
}
有这个片段的输出:
1
结束
2
如您所见,它在它真正完成之前完成。它在Finish之后显示2。
如果我通过这个修改以前的代码,它可以工作:
static void Main(string[] args)
{
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
var t = Task.Factory.StartNew(() => DoSomeWork(token))
.ContinueWith((prevTask) => DoSomeWork(token));
//t.ContinueWith((prevTask) => DoSomeWork(token));
Task.WaitAll(t);
Console.WriteLine("Finish");
Console.ReadKey();
}
static int id = 1;
static void DoSomeWork(CancellationToken ct)
{
ct.ThrowIfCancellationRequested();
Thread.Sleep(1000);
Console.WriteLine(id++);
}
有这个片段的输出:
1
2
结束
如您所知,我不需要在任务声明中使用 continueWith 语句,而是在引发事件时使用。
为什么 Task.WaitAll(t); 第一个样品不起作用吗?
有人可以帮助我吗?