以下代码:
var ui = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(() => { listBox1.Items.Add("Starting to crawl " + srMainSiteURL + "..."); } , ui);
导致以下错误:
Delegate 'System.Action<object>' does not take 0 arguments
在查看其他线程后,我无法确定也无法理解错误的原因。请指教。
答案 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 => { ... }
,ui
是StartNew
(对象)的第二个参数。
答案 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 );