Furkan Gözükara
Furkan Gözükara

Reputation: 23830

How may I resolve this error? - Delegate 'System.Action<object>' does not take 0 arguments

The following code:

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

is resulting in the following error:

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

After looking at other threads, I have not been able to determine nor understand the cause of the error. Please advise.

Upvotes: 8

Views: 12232

Answers (5)

Alois Kraus
Alois Kraus

Reputation: 13545

Because you did use

public Task StartNew(Action<object> action, object state)

I do think you wanted to use

public Task StartNew(Action action, CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskScheduler scheduler)

So your example would become:

Task.Factory.StartNew(() => { listBox1.Items.Add("Starting to crawl " + srMainSiteURL + "..."); }, CancellationToken.None, TaskCreationOptions.None, ui);

Upvotes: 8

xanatos
xanatos

Reputation: 111870

You are using this one: TaskFactory.StartNew Method (Action, Object)

that takes an Action<object>, so you should write p => { ... }, the ui is the second parameter of StartNew (an object).

Upvotes: 1

DeCaf
DeCaf

Reputation: 6096

If you want to specify a TaskScheduler in your call to Task.Factory.StartNew() you need to use one of the overloads that accepts it as an argument. You are calling the overload

StartNew(Action<object> action, object state)

which is probably not what you intended?

To use Task.Factory.StartNew() with a scheduler you also need to specify a CancellationToken and some TaskCreationOptions, that is the method documented here.

Upvotes: 0

Nick Butler
Nick Butler

Reputation: 24383

You are calling the wrong overload. If you want to pass a TaskScheduler, use this:

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

Upvotes: 0

Jon Skeet
Jon Skeet

Reputation: 1500855

You're trying to call StartNew(Action<object>, object). However, your lambda expression cannot be converted into an Action<object>.

Options:

  • Remove your second argument (ui) so that you end up calling StartNew(Action) which is fine for the lambda expression you've provided. For example:

    // The braces were redundant, by the way...
    Task.Factory.StartNew(() => listBox1.Items.Add("..."));
    
  • Change your lambda expression to accept a parameter:

    Task.Factory.StartNew(state => listBox1.Items.Add("..."), ui);
    

Upvotes: 4

Related Questions