#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. Вероятно, вы ошибаетесь.