метод как результат должен возвращать данные из события (например формы WinForms)
как упаковать событие в метод?
string method(string s)
{
form.ShowString(s);
//дождаться события SomeEvent
return //результат из события
}
partial class MainForm:Form
{
event Action<string> SomeEvent;//вызывается, например, по нажатию кнопки
void ShowString(string s)
{
//тело метода, провоцирует событие SomeEvent
}
}
В таком случае нужно использовать асинхронность и TaskCompletionSource:
async Task<string> method(string s)
{
var tcs = new TaskCompletionSource<string>();
form.SomeEvent += tcs.SetResult; // Повезло что совпали сигнатуры
try {
form.ShowString(s);
return await tcs.Task;
} finally {
form.SomeEvent -= tcs.SetResult;
}
}
Иногда можно обойтись без события:
async Task<string> ShowString(string s)
{
Debug.Assert(form.someTCS == null);
var tcs = form.someTCS = new TaskCompletionSource<string>();
try {
form.ShowString(s);
return tcs.Task;
} finally {
form.someTCS = null;
}
}
Иногда сигнатуры не совпадают и приходится писать более сложно:
async Task<string> ShowString(string s)
{
var tcs = new TaskCompletionSource<string>();
SomeEventHandler handler = (o, e) => tcs.SetResult(e.Result);
form.SomeEvent += handler;
try {
form.ShowString(s);
return await tcs.Task;
} finally {
form.SomeEvent -= handler;
}
}
В любом случае, вам придется "тянуть" асинхронный код сквозь все уровни выше:
async Task method2()
{
var msg = await method("Hello, world!");
// ...
}
Ну и небольшое замечание по архитектуре: подобный метод который только с формой и работает гораздо лучше смотрится в самом классе формы.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости