参数化动作

时间:2016-10-17 11:22:12

标签: c# delegates task-parallel-library

我不小心撞到了一个问题,我能够解决。但是,我担心我无法理解为什么错误编码能够编译(首先)。

以下是编译错误的错误代码:

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);

我的问题是,为什么编译器允许在没有参数的情况下调用参数化动作?

3 个答案:

答案 0 :(得分:3)

您的第一个代码将使用此overload,它将做的是返回操作委托,并且根本不会执行它。

您实际需要的重载是this,而您的第二个代码实际使用它并执行您的操作。

我想知道为什么你没有使用async and await代替ContinueWithTask.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; }

因此结果。