Как я могу устранить эту ошибку?- Делегат 'System.Action <object>' не принимает 0 аргументов - PullRequest
6 голосов
/ 16 октября 2011

следующий код:

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 ]

7 голосов
/ 16 октября 2011

Потому что вы использовали

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);
3 голосов
/ 16 октября 2011

Вы пытаетесь позвонить StartNew(Action<object>, object). Однако ваше лямбда-выражение не может быть преобразовано в Action<object>.

Параметры:

  • Удалите второй аргумент (ui), чтобы в итоге вы вызвали StartNew(Action), что хорошо для лямбда-выражения, которое вы указали. Например:

    // The braces were redundant, by the way...
    Task.Factory.StartNew(() => listBox1.Items.Add("..."));
    
  • Измените лямбда-выражение, чтобы оно принимало параметр:

    Task.Factory.StartNew(state => listBox1.Items.Add("..."), ui);
    
1 голос
/ 16 октября 2011

Вы используете это: TaskFactory.StartNew Метод (Action, Object)

, который принимает Action<object>, поэтому вы должны написать p => { ... }, ui - этовторой параметр StartNew (объект).

0 голосов
/ 16 октября 2011

Вы вызываете неправильную перегрузку. Если вы хотите передать TaskScheduler, используйте это:

Task.Factory.StartNew( () => { ... }, CancellationToken.None, TaskCreationOptions.None, ui );
0 голосов
/ 16 октября 2011

Если вы хотите указать TaskScheduler в своем вызове Task.Factory.StartNew(), вам нужно использовать одну из перегрузок, которая принимает его в качестве аргумента.Вы вызываете перегрузку

StartNew(Action<object> action, object state)

, которая, вероятно, не соответствует вашим ожиданиям?

Чтобы использовать Task.Factory.StartNew() с планировщиком, вам также необходимо указать CancellationToken и некоторые TaskCreationOptionsэто метод, описанный здесь .

...