参数化操作
本文关键字:操作 参数 | 更新日期: 2023-09-27 18:13:19
我不小心遇到了一个问题,我得以解决。然而,我担心我无法理解为什么错误ed代码能够编译(一开始(。
以下是编译良好的错误代码:
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);
我的问题是,为什么编译器允许在没有参数的情况下调用参数化操作?
您的第一个代码将使用此重载,它将返回操作委托,并且根本不会执行它。
您实际需要的重载就是这个,而您的第二个代码实际使用它并将执行您的操作
我想知道你为什么不使用async和wait而不是ContinueWith和Task.Run而不是Task.Factory.StartNew,这可能很危险。
你的代码可以简单得多:
Task<string> myTask = Task.Run(() =>
{
System.Threading.Thread.Sleep(1000);
return "mystrineg";
});
string str = await myTask;
action(str);
我的问题是,为什么编译器允许在没有参数的情况下调用参数化操作?
事实并非如此。在您的第一个版本中,您根本没有调用action
。即使没有争论也不行。您需要在不使用lambda的情况下直接传递它,或者使用一对空的()
来调用它才能真正调用它
虽然action;
不是一个有效的语句,但.ContinueWith
不仅需要Action<Task>
,还需要Func<Task, T>
,这正是您传递的。。。一个接受Task的函数,返回action
具有的任何类型:t => action;
t => action
是的缩写
t => { return action; }
从而得到结果。