参数化操作

本文关键字:操作 参数 | 更新日期: 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; }

从而得到结果。