我几乎忘记了可以
Task手动构建而不需要启动或调度它。然后,“ Task.Factory.StartNew”与“ new
Task(…)。Start”使我回到正轨。我认为这是
Task<TResult>构造函数实际上可能有用的少数几种情况之一,还有嵌套的任务(
Task<Task<T>>)和
Task.Unwrap():
// AsyncOpclass AsyncOp<T>{ Task<T> _pending = Task.FromResult(default(T)); public Task<T> CurrentTask { get { return _pending; } } public Task<T> RunAsync(Func<Task<T>> handler, bool useSynchronizationContext = false) { var pending = _pending; Func<Task<T>> wrapper = async () => { // await the prev task var prevResult = await pending; Console.WriteLine("nprev task result: " + prevResult); // start and await the handler return await handler(); }; var task = new Task<Task<T>>(wrapper); var inner = task.Unwrap(); _pending = inner; task.RunSynchronously(useSynchronizationContext ? TaskScheduler.FromCurrentSynchronizationContext() : TaskScheduler.Current); return inner; }}输出:
测试#1 ...上一个任务结果:0此任务参数:1000上一个任务结果:1000此任务arg:900上一个任务结果:900此任务arg:800按任意键继续测试#2 ...上一个任务结果:800此任务arg:100上一个任务结果:100此任务arg:200
现在,如果需要,
AsyncOp可以通过添加一个
lockto保护来使线程安全变得非常容易
_pending。



