У меня простой вопрос.
Учусь работать с Task'ами.
Самый простой пример обычно такой:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
var t = Task.Run(() => { Console.WriteLine(DateTime.Now.ToLongTimeString()); Thread.Sleep(2000); });
t.Wait();
Console.WriteLine("That's all!");
}
}
Но тут всё в лямбда - выражении, что не всегда удобно. Ок, можно написать так:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
var t1 = new Task(DoSomething);
t1.Start();
t1.Wait();
Console.WriteLine("That's all!");
}
static void DoSomething() {
Console.WriteLine($"Hi at {DateTime.Now.ToLongTimeString()}");
Thread.Sleep(2000);
}
}
Здесь я отделил момент создания таски от её запуска, что иногда может быть очень удобно. Но, как только появляется аргумент, это перестаёт работать:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
var t1 = new Task(DoSomething);
t1.Start();
var xxx = 42;
t1.Wait();
Console.WriteLine("That's all!");
}
static void DoSomething(int x) {
Console.WriteLine($"x = {x} at {DateTime.Now.ToLongTimeString()}");
Thread.Sleep(2000);
}
}
В строке var t1 = new Task(DoSomething) я получаю ошибку Error CS1503 Argument 1: cannot convert from 'method group' to 'System.Action'
Как можно создать задачу с аргументом, передающимся в неё?
Спасибо!
Дополнение я нашел вот такое - довольно понятное - объяснение.
Но там тоже пример какой то ущербный, компилятор ругается на него "Делегат "Action" не принимает аргументы 1." - вообще непонятная ошибка
Runв ответах. Можно создатьAction, а потом передавать его вTask, вот примеры: https://learn.microsoft.com/ru-ru/dotnet/api/system.threading.tasks.task?view=net-7.0 Сам конструкторTaskпринимаетAction, который по той же документации: инкапсулирует метод, который не имеет параметров и не возвращает значений. По этому, создать задачу так как вы хотите, вероятно не получится. – Павел Ериков stand with Russia Sep 08 '23 at 12:46