我该如何解决这个错误? – 委托’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 action, object state) 

我觉得你想用

 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, object) 。 但是,您的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 => { ... }uiStartNew (一个对象)的第二个参数。

你正在调用错误的重载。 如果要传递TaskScheduler ,请使用以下命令:

 Task.Factory.StartNew( () => { ... }, CancellationToken.None, TaskCreationOptions.None, ui ); 

如果要在调用Task.Factory.StartNew()指定TaskScheduler ,则需要使用其中一个接受它作为参数的重载。 你正在调用过载

 StartNew(Action action, object state) 

这可能不是你的意图?

要将Task.Factory.StartNew()与调度程序一起使用,还需要指定CancellationToken和一些TaskCreationOptions ,这是此处记录的方法 。