【问题标题】:Delegate 'System.Action<System.Threading.Tasks.Task>' does not take 0 arguments委托 'System.Action<System.Threading.Tasks.Task>' 不接受 0 个参数
【发布时间】:2016-05-12 14:17:42
【问题描述】:
System.Threading.Tasks.Task myTask = System.Threading.Tasks.Task.Factory.StartNew(() => TestMethodRefresh());
myTask.ContinueWith(() => TestMethodPrint(null), System.Threading.Tasks.TaskScheduler.FromCurrentSynchronizationContext);

private void TestMethodPrint(System.Threading.Tasks.Task task) {
            testDiv.InnerHtml = "from continue with";

}

我正在尝试使用在 .net 框架 4.0 vb.net 中运行良好的代码,但我无法在 asp.net .net 框架 4.5 中使用它。我不确定这意味着什么,它不需要 0 个参数。我尝试在 Lamba 中提供额外的参数,但它只是说它也不接受这些额外数量的参数。

【问题讨论】:

    标签: c# asp.net .net multithreading


    【解决方案1】:

    编译器会告诉你错误,因为你调用 .ContinueWith 并给它一个委托,它接受 0 个参数,而 .ContinueWith 期望 Action&lt;Task&gt; 而不是 Action。要解决您的问题,请按以下方式更改代码:

    Task myTask = Task.Factory.StartNew(() => TestMethodRefresh());
    myTask.ContinueWith((t) => TestMethodPrint(null), new CancellationToken());
    

    其他重载可能如下所示:

    Task myTask = Task.Factory.StartNew(() => { });
    myTask.ContinueWith((s, o) => TestMethodPrint(null), new object(), TaskScheduler.FromCurrentSynchronizationContext());
    

    您在 ContinueWith 中收到的参数 (t) 是上一个任务。查看MSDN了解更多信息。

    【讨论】:

    • 我在传递任务调度程序而不是取消令牌时尝试了这个,我得到了同样的错误。
    • 你不能这样。我使用了接收 Action 和 CancellationToken 的重载。如果您想通过 TaskScheduler 检查此重载并提供所有必需的参数。 msdn.microsoft.com/en-us/library/hh194761%28v=vs.110%29.aspx
    • 我已经更新了我的帖子,以使用其他重载,因此代码可以简单地编译。但是您确实需要了解签名以及您传递的参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2016-01-08
    • 2011-05-26
    • 2015-01-20
    • 1970-01-01
    相关资源
    最近更新 更多