我该如何解决这个错误? – 委托’System.Action ‘不带0个参数
以下代码:
var ui = TaskScheduler.FromCurrentSynchronizationContext(); Task.Factory.StartNew(() => { listBox1.Items.Add("Starting to crawl " + srMainSiteURL + "..."); } , ui);
导致以下错误:
Delegate 'System.Action' does not take 0 arguments
在查看其他线程后,我无法确定也无法理解错误的原因。 请指教。
因为你确实使用过
public Task StartNew(Action
我觉得你想用
public Task StartNew(Action action, CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskScheduler scheduler)
所以你的例子将成为:
Task.Factory.StartNew(() => { listBox1.Items.Add("Starting to crawl " + srMainSiteURL + "..."); }, CancellationToken.None, TaskCreationOptions.None, ui);
您正在尝试调用StartNew(Action
。 但是,您的lambda表达式无法转换为Action
。
选项:
-
删除你的第二个参数(
ui
),这样你最终调用StartNew(Action)
,这对你提供的lambda表达式来说很好。 例如:// The braces were redundant, by the way... Task.Factory.StartNew(() => listBox1.Items.Add("..."));
-
更改lambda表达式以接受参数:
Task.Factory.StartNew(state => listBox1.Items.Add("..."), ui);
您正在使用这个: TaskFactory.StartNew方法(Action,Object)
采用Action
,所以你应该写p => { ... }
, ui
是StartNew
(一个对象)的第二个参数。
你正在调用错误的重载。 如果要传递TaskScheduler
,请使用以下命令:
Task.Factory.StartNew( () => { ... }, CancellationToken.None, TaskCreationOptions.None, ui );
如果要在调用Task.Factory.StartNew()
指定TaskScheduler
,则需要使用其中一个接受它作为参数的重载。 你正在调用过载
StartNew(Action
这可能不是你的意图?
要将Task.Factory.StartNew()
与调度程序一起使用,还需要指定CancellationToken
和一些TaskCreationOptions
,这是此处记录的方法 。