Обернуть синхронный код в асинхронное ожидание в отключенном сценарии - PullRequest
0 голосов
/ 28 марта 2019

У меня есть следующий псевдокод в стиле клиент-сервер:

public void GetGrades() {
   var msg = new Message(...); // request in here
   QueueRequest?.Invoke(this, msg); // add to outgoing queue
}

В другом классе процессоров у меня есть цикл:

// check for messages back from server
// server response could be a "wait", if so, wait for real response
// raise MessageReceived event here
// each message is then processed by classes which catch the event

// send new messages to server
if (queue.Any()){
  var msg = queue.Dequeue();
  // send to server over HTTP 
}

Я сильно упростил этот код, поэтому цель моего вопроса легко понять.

В настоящее время я называю этот код так:

student.GetGrades(); // fire and forget, almost

Но у меня есть далеко не идеальный способ узнать, когда возвращается результат, я в основном использую события:

Я поднимаю MessageReceived?.Invoke(this, msg);, затем ловлю это на другом уровне StudentManager, который устанавливает результат для конкретного объекта учащегося.

Но вместо этого я хотел бы обернуть это в async await и получить что-то вроде этого:

var grades = await GetGrades();

Возможно ли это в таких отключенных сценариях? Как мне это сделать?

1 Ответ

2 голосов
/ 28 марта 2019

Вы можете попробовать использовать TaskCompletionSource . Вы могли бы сделать что-то вроде этого

TaskCompletionSource<bool> _tcs; 
public Task GetGrades() {
   var msg = new Message(...); // request in here
   QueueRequest?.Invoke(this, msg); // add to outgoing queue
   _tcs = new TaskCompletionSource<bool>();
   return _tcs;
}

А потом, когда вам нужно подтвердить, что задание выполнено, вы делаете.

_tcs.TrySetResult(true);

Делая это, вы можете сделать:

var grades = await GetGrades();

Конечно, здесь есть еще кое-что, что нужно решить. Где вы будете хранить эти TaskCompletionSource, если сможете много вызовов, и как вы можете связать каждое сообщение с каждым TaskCompletionSource. Но я надеюсь, что вы поняли основную идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...