anilkumar1986 Ответов: 1

Программирование 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

Смотрите предложения в оригинальном посте (ссылка ниже).

1 Ответов

Рейтинг:
8

Richard MacCutchan

Вы уже разместили этот вопрос на сайте Доски обсуждений asyn - .NET Framework на основе задач[^Пожалуйста, не делайте репостов.


anilkumar1986

да, это моя ошибка.Но ошибка, которую я публикую, ест мою голову.Так что я хоть кому-нибудь дам быстрое решение.

Richard MacCutchan

Не имеет значения, в чем проблема и как долго вы над ней работаете. Пожалуйста, соблюдайте правила и будьте терпеливы. Каждый, кто отвечает на вопросы здесь, является добровольцем и делает это в свое время. Если вы хотите мгновенного ответа, то вам нужно найти платную услугу.