I would like to write a method that will await for a variable to be set to true.
Here is the psudo code.
bool IsSomethingLoading = false SomeData TheData; public async Task<SomeData> GetTheData() { await IsSomethingLoading == true; return TheData; } TheData will be set by a Prism Event along with the IsSomethingLoading variable.
I have a call to the GetTheData method, but I would like it to run async (right now it just returns null if the data is not ready. (That leads to other problems.)
Is there a way to do this?
In many situations like this what you need is a TaskCompletionSource.
You likely have a method that is able to generate the data at some point in time, but it doesn't use a task to do it. Perhaps there is a method that takes a callback which provides the result, or an event that is fired to indicate that there is a result, or simply code using a Thread or ThreadPool that you are not inclined to re-factor into using Task.Run.
public Task<SomeData> GetTheData() { TaskCompletionSource<SomeData> tcs = new TaskCompletionSource<SomeData>(); SomeObject worker = new SomeObject(); worker.WorkCompleted += result => tcs.SetResult(result); worker.DoWork(); return tcs.Task; } While you may need/want to provide the TaskCompletionSource to the worker, or some other class, or in some other way expose it to a broader scope, I've found it's often not needed, even though it's a very powerful option when it's appropriate.
It's also possible that you can use Task.FromAsync to create a task based on an asynchronous operation and then either return that task directly, or await it in your code.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With