Pom*_*oma 7 c# async-await .net-4.5
我正在尝试在注册延续任务后开始一项任务。但在await Task.Delay()调用后,Continue 会立即触发。
using System;
using System.Linq;
using System.Threading.Tasks;
namespace ConsoleApplication30
{
class Program
{
static void Main(string[] args)
{
var task = new Task(async delegate {
Console.WriteLine("Before delay");
await Task.Delay(1000);
Console.WriteLine("After delay");
});
task.ContinueWith(t => {
Console.WriteLine("ContinueWith");
});
task.Start();
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Before delay
ContinueWith
After delay
Run Code Online (Sandbox Code Playgroud)
这里有什么问题吗?
Leg*_*nds -1
使用Task.Run
void Main()
{
Task.Run(async()=>{
Console.WriteLine("Before delay");
await Task.Delay(1000);
Console.WriteLine("After delay");
}).ContinueWith(t => {
// do somthing with your Task t here
Console.WriteLine("ContinueWith");
});
// task.Start();
Console.ReadLine();
}
// Define other methods and classes here
Run Code Online (Sandbox Code Playgroud)
输出:
延迟前
延迟后
继续
为什么你的代码不起作用:看看你的例子(有点修改):
static void Main(string[] args)
{
var outerTask = new Task(async delegate {
Console.WriteLine("Before delay");
await Task.Delay(1000); // inner task
Console.WriteLine("After delay");
},"Outertask");
outerTask.ContinueWith(t => {
Console.WriteLine("ContinueWith");
});
outerTask.Start();
outerTask.Wait(); // wait for outerTask to finish
var breakHere = 0; // set a brakpoint here
}
Run Code Online (Sandbox Code Playgroud)
您将获得对outerTask 的引用。outerTask 与innerTask 没有任何连接。调用 start 后,outerTasks 会触发委托的执行,并立即继续执行“ContinueWith”委托。延续连接到了outerTask!
OP的评论:
我正在尝试创建一个任务,在完成后将其自身从任务列表中删除。为了安全地执行此操作,我需要确保在启动之前将其添加到列表中。我正在尝试执行以下操作:创建一个任务,将其添加到列表中,注册删除它的延续,启动任务。有没有更好的办法?
虽然以下代码可以工作,但您必须首先证明使用的合理性!代码没有优化或者什么的。那里有或者肯定有更好的模式。做你的研究。
ConcurrentBag<AsyncLazy<Task>> taskList = new ConcurrentBag<AsyncLazy<Task>>();
void Main()
{
int v = 3242;
AsyncLazy<Task> objAsyncLazy = null;
objAsyncLazy = new AsyncLazy<Task>(new Func<Task<Task>>(async () =>
{
return await Task.FromResult<Task>(doLongRunningAsync(v).
ContinueWith<Task>(async (doLongRunningAsyncCompletedTask) =>
{
Console.WriteLine(doLongRunningAsyncCompletedTask.IsCompleted); //
await removeMeFromListAsync(objAsyncLazy);
}));
}));
taskList.Add(objAsyncLazy);
Console.WriteLine("al added");
Console.WriteLine("ConcurrentBag.Count: " + taskList.Count);
// execute the task
var t = objAsyncLazy.GetValueAsync(System.Threading.CancellationToken.None);
// wait for the first task "t" to finish or not,
// ContinueWith will execute after first task "t" has finished anyways.
t.Wait();
// ContinueWith is executing now
Console.ReadLine();
}
public async Task doLongRunningAsync(int val)
{
Console.WriteLine("Before delay" + val);
await Task.Delay(1000);
Console.WriteLine("After delay");
}
public async Task removeMeFromListAsync(AsyncLazy<Task> al) //(AsyncLazy<Task> t)
{
Console.WriteLine("continue start");
taskList.TryTake(out al);
Console.WriteLine("al removed");
Console.WriteLine("ConcurrentBag.Count: " + taskList.Count);
await Task.Delay(1000);
Console.WriteLine("continue end");
}
}
Run Code Online (Sandbox Code Playgroud)