2012-09-20 39 views
1

我通過回調中的websocket發送了幾條消息。問題是,如果一個發送未完成而另一個發送已經啓動,該功能超出了一個例外。由於socket.SendAsync()是異步我可以等待它與await。只要我使用await我將不得不宣佈我的lambda表達式爲async。但只要我這樣做,回調就不會被調用。有誰知道爲什麼或有解決方案/解決方法?在回調中使用await

示例代碼:

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

可能不是最有效的,但這裏有一個模式我用內嵌異步代碼:

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