Как создать Task с несколькими параметрами, вернуть тип, параметр TaskCreationOptions с помощью нового ключевого слова?

1

Как я могу создать новую задачу с несколькими параметрами, возвращаемым типом и createoptions, используя новый?

Task<int> task = Task<int>(DoWork(0,1));

private static Task<int> DoWork(int a, int b)
{
    return null;
} 

это работает нормально.... но когда я пытаюсь создать задачу с новым ключевым словом, поэтому я могу установить startoptions в longrunning следующим образом:

Task<int> task = new Task<int>(DoWork(0,1), TaskCreationOptions.LongRunning);

Я всегда получаю некоторые ошибки: Аргумент 1: невозможно преобразовать из "System.Threading.Tasks.Task" в "System.Func"

Я попробовал xx разные варианты, но не повезло. Я понимаю, что я, вероятно, ошибочно передаю параметр "Функция Func". Я хотел бы избежать анонимной функции. спасибо.

Теги:
task
task-parallel-library

3 ответа

1
Лучший ответ

Вы можете передать метод как Lambda Expression:

Task<Task<int>> task = new Task<Task<int>>(() => DoWork(0,1), TaskCreationOptions.LongRunning);

Хотя, если возможно, рекомендуется использовать Task.Factory.StartNew, поэтому вы возвращаете Hot Task вместо Cold Task (для которой требуется вызвать Task.Start).

Task<Task<int>> task = Task.Factory.StartNew(() => DoWork(0,1), TaskCreationOptions.LongRunning);
  • 0
    DoWork возвращает Task<int> не int поэтому это не скомпилируется.
  • 0
    @ Ли не видел этого, исправил код.
0

Для конструктора Task<T> требуется аргумент Func<T>.

Task<int> task = Task<int>(DoWork(0,1));

пытается вызвать метод DoWork и передать возвращенную Task<int> в качестве параметра в task задачи. Вам нужно передать Func<int>, изменив тип DoWork на:

private static int DoWork(int a, int b) { ... }

то вы можете сделать:

Task<int> task = new Task<int>(() => DoWork(0,1), TaskCreationOptions.LongRunning);
0
public SomeClass()
{
    var func = new Func<int, int, int>((i1, i2) => i1 + i2);
    Task.Factory.StartNew(() => 
        Debug.WriteLine(func(1, 2)), TaskCreationOptions.LongRunning);

    Task.Factory.StartNew(() => 
        Debug.WriteLine(DoWork(2, 3).Result), TaskCreationOptions.LongRunning);
}

private static Task<int> DoWork(int a, int b)
{
    return Task.FromResult(a + b);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню