Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
{
Task.Factory.StartNew(...);
}Является преступлением, т.к. образуется висячий объект Task, на который у вас нет ссылок, и если внутри таска возникнет исключение — оно выбросится в момент отработки финализатора для объекта Task, т.е. недетерминированно, а это совсем-совсем не хорошо.Поделитесь о каких паттернах Вы говорите.CLR APM и Task'и, в зависимости от того, что там асинхронно делается.
Вообще то я об этом написал в топикеГде? В последнем абзаце? Т.е. дать заведомо бажное и неприменимое решение и сказать «осторожнее с проблемами», не описав проблем и не указав, что в приведенном решении их нельзя обойти?
Можете не верить, но так и естьPure метод, возвращающий void ничего не делает, если он меняет состояние на сервере или что-то делает с общими ресурсами системы — он уже ни разу не Pure. Иначе зачем его вызывать, если приложению фиолетово, завершится он удачно или нет?
(Action work) => { throw new Exception(); }this.action = action => action(); public class MyClass {
Action<Action> action = (Action action) => { action(); };
...
Action<Action> action = (Action action) => { action(); };
(Action work) => { Task.Factory.StartNew(work); }
(Action work) => {
Log("Task started");
work();
Log("Task completed");
}
public class AsyncStrategy {
public void DoWork(Action work) {
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += (s, e) => { work(); };
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.RunWorkerAsync();
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
if(e.Error != null) {
//handle error here
}
BackgroundWorker worker = (BackgroundWorker)sender;
worker.RunWorkerCompleted -= worker_RunWorkerCompleted;
}
}
MyWorker worker = new MyWorker();
AsyncStrategy asyncStrategy = new AsyncStrategy();
worker.SetDoWorkStrategy(asyncStrategy.DoWork);
Кодоребус или паттерн «стратегия» на .Net 4.0