How may I resolve this error? - Delegate 'System.Action<object>' does not take 0 arguments
The following code:
var ui = TaskScheduler.FromCurrentSynchronizationCont开发者_Go百科ext();
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.
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);
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 callingStartNew(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);
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).
You are calling the wrong overload. If you want to pass a TaskScheduler
, use this:
Task.Factory.StartNew( () => { ... }, CancellationToken.None, TaskCreationOptions.None, ui );
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.
精彩评论