Итак, вам нужно дождаться ответа от другого места в вашем приложении (локальный сервер).Ответ будет запущен там первым.Локальный сервер должен иметь событие, на которое вы можете подписаться (OnMessage
в моем примере).Это событие перешлет вам сообщение о результате.
Синхронизация может быть обработана с помощью TaskCompletionSource.Вы создадите задание, которое вы можете использовать для получения результата синхронно или асинхронно.
Примерно так:
public string ControllerFunction()
{
return ControllerFunctionTask().Result;
}
public Task<string> ControllerFunctionTask()
{
sendMessage("a message");
var task = new TaskCompletionSource<string>();
localServer.OnMessage = (message) =>
{
task.SetResult(message);
};
return task.Task;
}
Как указано в комментариях, синхронное ожидание асинхронного задания может привести к взаимоблокировке.Это может произойти, если поток вызывающей стороны - context
thread (UI, ASP).Поэтому к этому лучше подходить:
public async Task<string> ControllerFunction()
{
return await ControllerFunctionTask();
}
public Task<string> ControllerFunctionTask()
{
sendMessage("a message");
var task = new TaskCompletionSource<string>();
localServer.OnMessage = (message) =>
{
task.SetResult(message);
};
return task.Task;
}
OnMessage
можно определить следующим образом:
public event Action<string> OnMessage;
Тогда он будет вызван сразу после строки, где вы получите строку clientMessage:
string clientMessage = Encoding.ASCII.GetString(incommingData);
if (OnMessage != null)
OnMessage(clientMessage);