我不小心撞到了一个问题,我能够解决。但是,我担心我无法理解为什么错误编码能够编译(首先)。
以下是编译错误的错误代码:
Task<string> myTask = Task<string>.Factory.StartNew(() =>
{
System.Threading.Thread.Sleep(1000);
return "mystrineg";
});
myTask.ContinueWith(t => action, CancellationToken.None,
TaskContinuationOptions.NotOnFaulted, TaskScheduler.Default);
上述代码的问题是:action
根本没有被调用。
这是我做的修复:
Task<string> myTask = Task<string>.Factory.StartNew(() =>
{
System.Threading.Thread.Sleep(1000);
return "mystrineg";
});
myTask.ContinueWith(t => action(t.Result), CancellationToken.None,
TaskContinuationOptions.NotOnFaulted, TaskScheduler.Default);
我的问题是,为什么编译器允许在没有参数的情况下调用参数化动作?
答案 0 :(得分:3)
您的第一个代码将使用此overload,它将做的是返回操作委托,并且根本不会执行它。
您实际需要的重载是this,而您的第二个代码实际使用它并执行您的操作。
我想知道为什么你没有使用async and await代替ContinueWith和Task.Run而不是Task.Factory.StartNew,它可以是dangerous。
您的代码可以更简单:
Task<string> myTask = Task.Run(() =>
{
System.Threading.Thread.Sleep(1000);
return "mystrineg";
});
string str = await myTask;
action(str);
答案 1 :(得分:2)
我的问题是,为什么编译器允许在没有参数的情况下调用参数化动作?
没有。在您的第一个版本中,您根本没有致电action
。甚至没有争论。你需要在没有lambda的情况下直接传递它,或者用一对空()
来调用它来实际调用它。
虽然action;
不是有效的陈述,但.ContinueWith
不仅会Action<Task>
,还会Func<Task, T>
,而这正是您传递的......获取任务的函数,返回action
所拥有的任何类型:t => action;
答案 2 :(得分:2)
t => action
是简称:
t => { return action; }
因此结果。