在回调中使用await

时间:2012-09-20 18:14:27

标签: c# asp.net-mvc asynchronous callback websocket

我通过回调内的websocket发送了几条消息。问题是,如果一个发送未完成而另一个发送未完成,则该功能超出异常。由于socket.SendAsync()是异步的,我可以使用await等待它。一旦我使用await,我就必须将我的lambda表达式声明为async。但是一旦我这样做,回调就永远不会被调用。有谁知道为什么或确实有解决方案/解决方法?

示例代码:

queue.QueueCompleted += async (s, eA) =>
    {
        z = dr.Start + 1;
        while (z < (dr.Start + 1 + dr.Limit))
        {
            string path = AppDomain.CurrentDomain.BaseDirectory + @"DCM\" + dr.Code.Replace('.', '_') + @"\IMAGE" + z.ToString() + ".jpg";
            Image image = null;
            image = Image.FromFile(path);
            ImageConverter ic = new ImageConverter();
            byte[] buffer = (byte[])ic.ConvertTo(image, typeof(byte[]));
            try
            {
                if (socket != null && socket.State == WebSocketState.Open)
                {
                    Debug.WriteLine("REACHED");
                    await socket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Binary, true, CancellationToken.None);
                    image.Dispose();
                }
            }
            catch (Exception e)
            {
                image.Dispose();
                break;
            }
            z++;
        }
    };

回调是一个简单的EventHandler,称为if(QueueCompleted != null) QueueCompleted(e, null);

2 个答案:

答案 0 :(得分:2)

可能不是最有效的,但这是我用于内联异步代码的模式:

queue.QueueCompleted += (s, eA) =>
            {
                Task.Run(async ()=>{
                    //blah
                });
            };

答案 1 :(得分:2)

您可以尝试使用

queue.QueueCompleted += (a, b) => { Task.Run(async ()=> { ....   });  };

链接:http://msdn.microsoft.com/en-us/library/hh195051.aspx