我已经实施了instagram api realtime updates。基本上,当我根据订阅添加新图像时,他们会向我提供的网址发出POST请求。
他们说:“你应该在2秒的超时内确认POST - 如果你需要对收到的信息进行更多的处理,你可以在异步任务中这样做。”
所以我建立了类似的东西:
[HttpPost]
[ActionName("realtime")]
public async Task<ActionResult> IndexPost()
{
var form = Request.Form;
Request.InputStream.Position = 0;
System.IO.StreamReader str = new System.IO.StreamReader(Request.InputStream);
string sBuf = str.ReadToEnd();
// deserialize this from json
var serializer = new JavaScriptSerializer();
var updates = serializer.Deserialize<IEnumerable<RealtimeUpdate>>(sBuf).ToList();
ProcessNewTaggedImages(updates);
return new ContentResult { Content = "Ok" };
}
其中ProcessNewTaggedImages
正在运行异步。
public async void ProcessNewTaggedImages(List<RealtimeUpdate> updates)
{
Task.Run(() =>
{
// query Instagram api for new images
}
}
所以基本上当Instagram发布到www.mysite.com/realtime时,它不等待ProcessNewTaggedImages
。
我只是想确保这种方法对于fire and forget方法是正确的,因为在Task.Run下我收到一条警告说:
由于未等待此调用,因此在完成调用之前会继续执行当前方法。考虑将await运算符应用于调用的结果。
但我不想在这里等待,因为
你能证实我走在正确的轨道上吗? Ps:POST工作正常,所有工作都很好,只是想确认我没有做任何mystake,因为我主要是初学者在C#中的这种异步方法。
答案 0 :(得分:1)
如果您需要解雇并忘记功能,则不需要在方法中添加异步关键字,因为您没有等待。因此,从代码中删除异步关键字,编译器不会抱怨您的代码。
答案 1 :(得分:1)
我认为您可能需要先read though this。
我引用:“如果异步方法不使用await运算符来标记暂停点,则该方法将作为同步方法执行,尽管存在异步修饰符。”