我该如何解决这个错误? - 委托'System.Action <object>'不带0个参数</object>

时间:2011-10-15 21:40:48

标签: c# task

以下代码:

var ui = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(() => { listBox1.Items.Add("Starting to crawl " + srMainSiteURL + "..."); } , ui);

导致以下错误:

  

Delegate 'System.Action<object>' does not take 0 arguments

在查看其他线程后,我无法确定也无法理解错误的原因。请指教。

5 个答案:

答案 0 :(得分:7)

因为您确实使用了

public Task StartNew(Action<object> 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);

答案 1 :(得分:3)

您正试图致电StartNew(Action<object>, object)。但是,您的lambda表达式无法转换为Action<object>

选项:

  • 删除你的第二个参数(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);
    

答案 2 :(得分:1)

你正在使用这个:TaskFactory.StartNew Method (Action, Object)

需要Action<object>,所以你应该写p => { ... }uiStartNew(对象)的第二个参数。

答案 3 :(得分:0)

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

StartNew(Action<object> action, object state)

这可能不是你想要的?

要将Task.Factory.StartNew()与调度程序一起使用,您还需要指定CancellationToken和一些TaskCreationOptions,即method documented here

答案 4 :(得分:0)

你正在调用错误的重载。如果您想传递TaskScheduler,请使用:

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