1

コールバック内の websocket を介していくつかのメッセージを送信しています。問題は、1 つの送信が完了せずに別の送信が開始された場合、関数が例外を超えて超過することです。is async のためsocket.SendAsync()、 でそれを待つことができましたawait。使用するとすぐにawait、ラムダ式を として宣言する必要があり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);

4

2 に答える 2

2

おそらく最も効率的ではありませんが、インライン非同期コードに使用するパターンを次に示します。

queue.QueueCompleted += (s, eA) =>
            {
                Task.Run(async ()=>{
                    //blah
                });
            };
于 2012-09-20T18:17:25.440 に答える
2

あなたはで試すことができます

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

リンク: http://msdn.microsoft.com/en-us/library/hh195051.aspx

于 2012-09-20T18:18:13.723 に答える