Отделение вызывающего от вызываемого в C # с помощью делегата / BeginInvoke

#c# #multithreading #delegates #begininvoke

#c# #многопоточность #делегаты #begininvoke

Вопрос:

В 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. находятся ли вызывающий и вызываемый в разных потоках?

2. Есть кое-что, что можно сказать о том, чтобы не писать этот код. Вам не хватает требуемого вызова EndInvoke(). Вспомогательными классами для правильного выполнения являются Task в .NET 4 и BackgroundWorker.

3. @Hans: Это хорошая информация. Класс Task действительно является лучшим способом запуска нового потока. Спасибо!

Ответ №1:

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

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

Комментарии:

1. Я думал, что официальная позиция Microsoft заключалась в том, что TPL не был готов к производственному коду?

2. @Ramhound: если он не готов к производству, я не думаю, что MS (или кто-либо еще) будет продвигать его как одну из основных функций в своей новой версии framework. Вероятно, вы ошибаетесь.