这种火灾和遗忘方法是否正确?

时间:2013-09-30 12:03:44

标签: c# asp.net-mvc

我已经实施了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运算符应用于调用的结果。

但我不想在这里等待,因为

  1. 我的处理结果对于Instagram通话无关紧要
  2. POST超时为2秒,所以我不想等待这个处理。
  3. 你能证实我走在正确的轨道上吗? Ps:POST工作正常,所有工作都很好,只是想确认我没有做任何mystake,因为我主要是初学者在C#中的这种异步方法。

2 个答案:

答案 0 :(得分:1)

如果您需要解雇并忘记功能,则不需要在方法中添加异步关键字,因为您没有等待。因此,从代码中删除异步关键字,编译器不会抱怨您的代码。

答案 1 :(得分:1)

我认为您可能需要先read though this

我引用:“如果异步方法不使用await运算符来标记暂停点,则该方法将作为同步方法执行,尽管存在异步修饰符。”