Подтвердить что ты не робот

Напишите метод Async, который будет ждать bool

Я хотел бы написать метод, который будет await для переменной, которая будет установлена ​​в true.

Вот код psudo.

bool IsSomethingLoading = false
SomeData TheData;

public async Task<SomeData> GetTheData()
{
   await IsSomethingLoading == true;
   return TheData;
}

TheData будет установлен событием Prism вместе с переменной IsSomethingLoading.

У меня есть вызов метода GetTheData, но я бы хотел, чтобы он запускал async (прямо сейчас он просто возвращает null, если данные не готовы. (Это приводит к другим проблемам.)

Есть ли способ сделать это?

4b9b3361

Ответ 1

Во многих ситуациях вам нужно TaskCompletionSource.

Вероятно, у вас есть метод, который способен генерировать данные в определенный момент времени, но для этого не используется задача. Возможно, есть метод, который выполняет обратный вызов, который дает результат, или событие, которое запускается, чтобы указать, что есть результат, или просто код с использованием Thread или ThreadPool, который вы не склонны перегруппировать в используя 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;
}

В то время как вам может потребоваться/нужно предоставить TaskCompletionSource рабочему или другому классу или каким-либо другим способом выставить его в более широкую область, я нашел, что он часто не нужен, хотя он очень мощный вариант, когда он подходит.

Также возможно, что вы можете использовать Task.FromAsync для создания задачи на основе асинхронной операции, а затем либо вернуть эту задачу напрямую, либо await в свой код.

Ответ 2

В качестве вашего сигнала вы можете использовать TaskCompletionSource и await, которые:

TaskCompletionSource<bool> IsSomethingLoading = new TaskCompletionSource<bool>();
SomeData TheData;

public async Task<SomeData> GetTheData()
{
   await IsSomethingLoading.Task;
   return TheData;
}

И в вашем событии Prism выполните:

IsSomethingLoading.SetResult(true);