ObjectDisposedException when trying to access Thread.CurrentPrincipal using async method

I am new to the new asynchronous / pending. However, I have the following classes:

public abstract class PluginBase
{
   //Using EF to store log info to database
   private EFContext _context = new EFContext();
   private int Id = 1;
   protected void LogEvent(string event, string details)
   {
       _context.LogEvents.Add(new LogItem(){
          PluginId = this.Id,
          Event = event,
          Details = details,
          User = Thread.CurrentPrincipal.Identity.Name
       });
   }
 }

public class Plugin : PluginBase
{
   public void Process()
   {
      CallWebService();
   }

   public async void CallWebService()
   {
       using(var http = new HttpClient())
       {
          ...
          var result = await http.PostAsync(memberURI, new StringContent(content, Encoding.UTF8,"application/json"));
          if(result.IsSuccessStatusCode)
             _status = "Success";
          else
             _status = "Fail";

          LogEvent("Service Call - " + _status,...);

       }
}

So the idea is that Plugin.Process is called. It, in turn, calls CallWebService (). CallWebService makes an asynchronous call to http.PostAsync. When I get back from this call and try to call base.LogEvent (), I get an ObjectDisposedException that says "Safe handle closed."

I know that something happens where, when the expected completes, the rest of the method code should be running. Maybe it is being launched into some other thread or context? If so, how do I get the current user while logging?

Thanks for your help in this.

Edit Yuval, , , .

public void Process()
{
    var task = CallWebService();
    task.Wait();
}
public async Task CallWebService(List<Member> members)
{
    using(var http = new HttpClient())
    {
       ...
       using(var result = await http.PostAsync(memberURI, new StringContent content, Encoding.UTF8, "application/json")))
       {
          if(result.IsSuccessStatusCode)
             _status = "Success";
          else
             _status = "Fail";
          LogEvent("Service Call - " + _status,...);
        }
    }
 }
+4
1

base.LogEvent(), ObjectDisposedException, , " ".

, - , - , . async void " ". await Process, , , , .

async void async Task await :

public Task ProcessAsync()
{
    return CallWebServiceAsync();
}

public async Task CallWebServiceAsync()
{
   using (var http = new HttpClient())
   {
      var result = await http.PostAsync(memberURI, 
                                        new StringContent(content,
                                                          Encoding.UTF8,
                                                          "application/json"));
      if (result.IsSuccessStatusCode)
         _status = "Success";
      else
         _status = "Fail";

      LogEvent("Service Call - " + _status,...);
   }
}

, await ProcessAsync - .

+3

All Articles