3

我已经实现了 instagram api 实时更新。基本上,当根据我的订阅添加了新图像时,他们会向我提供的 url 发出 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 秒,所以我不想等待这个处理。

你能确认我在正确的轨道上吗?Ps:POST 工作正常,一切正常,只是想确认我没有做任何 mystake,因为我主要是 C# 中这种异步方法的初学者。

4

2 回答 2

1

如果您需要触发并忘记功能,则无需在方法中添加异步关键字,因为您没有进行任何等待。所以从你的代码中删除 async 关键字,编译器不会抱怨你的代码。

于 2013-09-30T12:15:49.973 回答
1

我认为您可能需要先 阅读此内容

我引用:“如果 async 方法不使用 await 运算符来标记暂停点,则该方法会像同步方法一样执行,尽管有 async 修饰符。”

于 2013-09-30T12:25:44.320 回答