Если бы вы могли изменить интерфейс (что не было для меня ограничением, когда у меня была похожая проблема), мне казалось, что Lazy<Task>
можно было бы использовать для решения этой проблемы. Так что я попробовал это.
Это работает, по крайней мере, для того, что я хочу иметь в виду под «текущей задачей». Но это тонкий код, потому что AsyncMethodThatYouWantToRun
должен делать Task.Yield()
.
Если вы не уступите, произойдет сбой с System.AggregateException: 'One or more errors occurred. (ValueFactory attempted to access the Value property of this instance.)'
Lazy<Task> eventuallyATask = null; // silly errors about uninitialized variables :-/
eventuallyATask = new Lazy<Task>(
() => AsyncMethodThatYouWantToRun(eventuallyATask));
Task t = eventuallyATask.Value; // actually start the task!
async Task AsyncMethodThatYouWantToRun(Lazy<Task> lazyThisTask)
{
await Task.Yield(); // or else, the 'task' object won't finish being created!
Task thisTask = lazyThisTask.Value;
Console.WriteLine("you win! Your task got a reference to itself");
}
t.Wait();
В качестве альтернативы вместо тонкости Task.Yield
мы могли бы просто пройти весь путь до конца и использовать TaskCompletionSource<Task>
для ее решения. (исключая любые потенциальные ошибки/взаимоблокировки, поскольку наша задача безопасно освобождает поток, пока он не узнает себя!)
var eventuallyTheTask = new TaskCompletionSource<Task>();
Task t = AsyncMethodThatYouWantToRun(eventuallyTheTask.Task); // start the task!
eventuallyTheTask.SetResult(t); //unblock the task and give it self-knowledge
async Task AsyncMethodThatYouWantToRun(Task<Task> thisTaskAsync)
{
Task thisTask = await thisTaskAsync; // gets this task :)
Console.WriteLine("you win! Your task got a reference to itself (== 't')");
}
t.Wait();
person
Tim Lovell-Smith
schedule
06.12.2019
SomeImplementation
? Еще лучше, IMO, передатьMyState
конструктору и вообще не требовать знанийTask
вMethodFromSomeInterface
. - person Stephen Cleary   schedule 15.07.2011MyState
с текущим экземпляромTask
. - person Reuven Bass   schedule 15.07.2011MethodFromSomeInterface
может вызываться одновременно в разных задачах. - person Reuven Bass   schedule 15.07.2011