Программирование aync на основе задач
Привет друзья,
В нашем проекте мы меняем некоторые методы синхронные на асинхронные.Есть одна ситуация, когда я использую концепцию task.run, у нас есть глобальный журнал ошибок, где мы можем прочитать всю структуру ошибки.когда я применяю task.run глобальный журнал ошибок нарушается.
Вот мой код:
try{ Task.Run(() => { SendMailForGSSCQuotes(mDBEntity.QUOTATIONNUMBER.ToString(), Convert.ToInt32(mDBEntity.ThresholdQty), Convert.ToInt32(mDBEntity.ISHAZARDOUSCARGO), Convert.ToInt32(mDBEntity.HASMISSINGCHARGES)); }).ConfigureAwait(false); } catch(Exception ex){ Hide Copy Code LogErrorAsync("api/Quotation", "SendMail", ex.Message.ToString(), ex.StackTrace.ToString()); }
в
SendMailForGSSCQuotes
намеренно выбрасывая ошибку, чтобы увидеть, как работает глобальный журнал ошибок.protected void LogErrorAsync(string controller, string action, string message, string stacktrace, string user = "") { QuotationDBFactory mFactory = new QuotationDBFactory(); mFactory.InsertErrorLog( user, controller, action, message, stacktrace ); SendEmailAysnc(stacktrace, message).ConfigureAwait(false); } internal async Task<bool> SendEmailAysnc(string st, string ex) { try { var Content = string.Empty; if (this.ActionContext.Request.Method.ToString() == "POST") { var d = new StreamReader(await Task.Run(() => this.ActionContext.Request.Content.ReadAsStreamAsync().Result).ConfigureAwait(true)); d.BaseStream.Seek(0, SeekOrigin.Begin); Content = d.ReadToEnd(); } var hostdata = ((System.Web.HttpRequestWrapper)this.RequestContext.GetType().Assembly.GetType("System.Web.Http.WebHost.WebHostHttpRequestContext").GetProperty("WebRequest").GetMethod.Invoke(this.RequestContext, null)); var exdata = new ExceptionEmailDto() { ActionMethod = this.ActionContext.Request.Method.ToString(), AppUrl = System.Configuration.ConfigurationManager.AppSettings["APPURL"], Error = ex, Headers = this.ActionContext.Request.Headers.ToString(), ServerName = System.Configuration.ConfigurationManager.AppSettings["ServerName"], StackTrace = st, Url = this.ActionContext.Request.RequestUri.ToString(), UserAgent = hostdata.UserAgent == null ? string.Empty : hostdata.UserAgent.ToString(), UserHostAddress = hostdata.UserHostAddress == null ? string.Empty : hostdata.UserHostAddress.ToString(), UserHostName = hostdata.UserHostName == null ? string.Empty : hostdata.UserHostName.ToString(), UTC = DateTime.UtcNow.ToString(), Content = Content, ServerVariables = hostdata.ServerVariables == null ? "undefined" : hostdata.ServerVariables.ToString() }; FOCiS.SSP.Web.UI.Controllers.APIDynamicClass.SendExceptionEmailV2( exdata ); } catch (Exception exc) { FOCiS.SSP.Web.UI.Controllers.APIDynamicClass.SendExceptionEmail(this.ActionContext.Request.Method.ToString(), exc.Message.ToString(), exc.StackTrace.ToString() ); return false; } return true; }
Получение ошибки здесь
var d = new StreamReader(await Task.Run(() => this.ActionContext.Request.Content.ReadAsStreamAsync().Result).ConfigureAwait(true));
Ошибка:
Cannot access a disposed object. Object name: 'System.Web.Http.WebHost.HttpControllerHandler+LazyStreamContent'.
Я пробовал так много способов, если я удаляю задачу.запустить его работает нормально.
Спасибо
Что я уже пробовал:
В нашем проекте мы меняем некоторые методы синхронные на асинхронные.Есть одна ситуация, когда я использую концепцию task.run, у нас есть глобальный журнал ошибок, где мы можем прочитать всю структуру ошибки.когда я применяю task.run глобальный журнал ошибок нарушается.
Bohdan Stupak
Я не уверен, что именно вызывает эту проблему, но в любом случае этот код таков.ActionContext.Request.Содержание.ReadAsStreamAsync().Result выглядит подозрительно, потому что вызов .Result блокирует поток, приводящий все ваши асинхронные/ожидающие усилия к нулю.
Попробуйте что-нибудь вроде этого
var d = new StreamReader(ждите этого.ActionContext.Request.Содержание.ReadAsStreamAsync().ConfigureAwait(true));
anilkumar1986
не повезло, что его ошибка броска не может получить доступ к удаленному объекту.
Имя объекта: 'System.Web.Http.WebHost.HttpControllerHandler+LazyStreamContent'.
anilkumar1986
если я уберу Таса.Запустите все работает нормально похоже какой то поток блокируется
Bohdan Stupak
в моем комментарии тоже нет задачи. кстати, раньше я не обращал внимания: почему вы используете ConfigureAwait(true)?
anilkumar1986
я попробовал оба способа ConfigureAwait(false) и ConfigureAwait(true), но безуспешно
anilkumar1986
я ставлю потому что это будет продолжаться в том же потоке
Richard MacCutchan
Смотрите предложения в оригинальном посте (ссылка ниже).