событие в метод - C#

257
24 июля 2018, 15:30

метод как результат должен возвращать данные из события (например формы WinForms)
как упаковать событие в метод?

string method(string s)
{
  form.ShowString(s);
  //дождаться события SomeEvent
  return //результат из события
}
partial class MainForm:Form
{
  event Action<string> SomeEvent;//вызывается, например, по нажатию кнопки
  void ShowString(string s)
  {
     //тело метода, провоцирует событие SomeEvent
  }
}
Answer 1

В таком случае нужно использовать асинхронность и 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!");
    // ...
}

Ну и небольшое замечание по архитектуре: подобный метод который только с формой и работает гораздо лучше смотрится в самом классе формы.

READ ALSO
Запуск программы через планировщик

Запуск программы через планировщик

В общем сделал программу и хочу ее повесить на планировщик задач Windows

314
Имперсонализация в C#

Имперсонализация в C#

В общем, мне нужно обратится к сетевому ресурсу под другой учеткой

230
Ограничения generic метода

Ограничения generic метода

Каким образом можно задать ограничения generic методу?

213
Ошибка при компиляции c# проекта [закрыт]

Ошибка при компиляции c# проекта [закрыт]

Скачал себе visual studio для мака, создал проект под с#, решил запустить а оно выдает ошибку: Invalid 'cwd' value '/Users/sk

252