Отключение вызывающего абонента от вызываемого в C # с использованием делегата / BeginInvoke - PullRequest
2 голосов
/ 25 октября 2011

В C # у меня есть иерархия классов, которые выполняют действия, которые потенциально могут занять много времени. По этой причине я реализовал механизм развязки / обратного вызова, чтобы вызывающий не блокировался, а был информирован о завершении действия через интерфейс обратного вызова. Это выглядит примерно так:

protected delegate void ActionDelegate();
public void doAction()
{
  Task.Factory.StartNew(() => DoActionASync());
}
private void DoActionASync()
{
  DoActionImpl(); 
  Caller->ActionDone(); // Caller is registered separately, and implements an interface (ICallback) that includes this function
}
protected abstract void DoActionImpl(); // Derived classes implement this

Это довольно много кода, который повторяется с небольшими отличиями (в сигнатуре) для каждого метода. Мой вопрос заключается в том, является ли это правильным подходом к этому, или .NET / C # предлагает какие-либо конструкции, которые сделали бы это проще / менее многословным?

1 Ответ

4 голосов
/ 25 октября 2011

На MSDN имеется хорошая документация по шаблонам асинхронного программирования. Если вы используете .NET 4, вам следует обратиться к параллельной библиотеке задач (TPL).

Асинхронное программирование с использованием делегатов рассматривается здесь (есть также дополнительный пример ). Вы можете сделать намного хуже, если будете следовать рекомендациям и советам MSDN.

...