Итак, я пытаюсь использовать функции TPL в .NET 4.0, и у меня есть такой код (не смейтесь):
/// <summary>Fetches a thread along with its posts. Increments the thread viewed counter.</summary>
public Thread ViewThread(int threadId)
{
// Get the thread along with the posts
Thread thread = this.Context.Threads.Include(t => t.Posts)
.FirstOrDefault(t => t.ThreadID == threadId);
// Increment viewed counter
thread.NumViews++;
Task.Factory.StartNew(() =>
{
try {
this.Context.SaveChanges();
}
catch (Exception ex) {
this.Logger.Error("Error viewing thread " + thread.Title, ex);
}
this.Logger.DebugFormat(@"Thread ""{0}"" viewed and incremented.", thread.Title);
});
return thread;
}
Так что мои непосредственные проблемы с лямбдой таковы.(мой элемент структуры данных сущности), this.Logger (член logger) и thread (используется в вызове logger).Обычно в дни QueueUserWorkItem () я бы подумал, что их нужно будет передать в делегат как часть объекта состояния.Будут ли замыкания спасать меня от необходимости делать это?
Другая проблема состоит в том, что тип, в котором эта подпрограмма реализует IDisposable и, следовательно, находится в операторе using.Так что, если я сделаю что-то вроде ...
using (var bl = new ThreadBL()) {
t = bl.ViewThread(threadId);
}
... я собираюсь создать гонку между вызовом dispose () и TPL, использующим мою лямбду?
В настоящее время я вижу, как контекст сохраняет данные обратно в мою базу данных, но без регистрации - без исключений.Это может быть с моей стороны, но что-то в этом коде кажется странным.Я не хочу иметь необработанные исключения в других темах.Любой вход приветствуется!