В ответе на один из моих других вопросов мне сказали, что использование new Task(() => { })
не является чем-то обычным. Мне посоветовали использовать Func<Task>
вместо этого. Я пытался заставить это работать, но я не могу понять это. (Вместо того, чтобы перетаскивать его в комментариях, я задаю здесь отдельный вопрос.)
Мой конкретный сценарий c заключается в том, что мне нужно, чтобы задача не запускалась правильно при объявлении * 1008. * и чтобы иметь возможность дождаться его позже.
Вот пример LinqPad, использующий new Task(() => { })
. ПРИМЕЧАНИЕ: это работает отлично! (за исключением того, что оно использует new Task
.)
static async void Main(string[] args)
{
// Line that I need to swap to a Func<Task> somehow.
// note that this is "cold" not started task
Task startupDone = new Task(() => { });
var runTask = DoStuff(() =>
{
//+++ This is where we want to task to "start"
startupDone.Start();
});
//+++ Here we wait for the task to possibly start and finish. Or timeout.
// Note that this times out at 1000ms even if "blocking = 10000" below.
var didStartup = startupDone.Wait(1000);
Console.WriteLine(!didStartup ? "Startup Timed Out" : "Startup Finished");
await runTask;
Console.Read();
}
public static async Task DoStuff(Action action)
{
// Swap to 1000 to simulate starting up blocking
var blocking = 1; //1000;
await Task.Delay(500 + blocking);
action();
// Do the rest of the stuff...
await Task.Delay(1000);
}
Я попытался поменять вторую строку на:
Func<Task> startupDone = new Func<Task>(async () => { });
Но тогда строки под комментариями с +++
в них не работают правильно.
Я поменял startupDone.Start()
на startupDone.Invoke()
.
Но startupDone.Wait
нужна задача. Который возвращается только в лямбду. Я не уверен, как получить доступ к задаче за пределами лямбды, чтобы я мог Wait
для нее.
Как можно использовать Func<Task>
и запустить его в одной части моего кода и сделать Wait
для этого в другой части моего кода? (Как я могу с new Task(() => { })
).