Как я могу создать новую задачу с несколькими параметрами, возвращаемым типом и 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". Я хотел бы избежать анонимной функции. спасибо.
Вы можете передать метод как 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);
Для конструктора 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);
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);
}
DoWork
возвращаетTask<int>
неint
поэтому это не скомпилируется.