I am new to the new asynchronous / pending. However, I have the following classes:
public abstract class PluginBase
{
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,...);
}
}
}