2013-08-21 29 views
5

Tại nơi làm việc, tôi hiện đang bị mắc kẹt trong 3.5, nhưng chúng tôi đang sử dụng asyncbridge cho async-await. Chúng tôi đang sử dụng rất nhiều cuộc gọi không đồng bộ WCF cũ, và tôi muốn bọc nó vào mẫu chờ đợi async mới.WCF 3.5, AsyncBridge. Bọc trong async-await

Tôi gói này như sau:

// async is wrong 
    public /*async*/ Task<ScannedDocumentResult> GetScannedDocumentsTask(String assignmentId) 
    { 
     TaskCompletionSource<ScannedDocumentResult> tcs = new TaskCompletionSource<ScannedDocumentResult>(); 
     EventHandler<GetScannedDocumentsCompletedEventArgs> handler = null; 
     handler = (o, e) => 
      { 
       if (e.UserState != tcs) 
        return; 

       if (e.Error != null) 
        tcs.SetException(e.Error); 
       else if (e.Cancelled) 
        tcs.SetCanceled(); 
       else 
        tcs.SetResult(e.Result); 

       GetScannedDocumentsCompleted -= handler; 
      }; 
     GetScannedDocumentsCompleted += handler; 
     GetScannedDocumentsAsync(assignmentId, tcs); 

     return tcs.Task;    
    } 

Sau đây là genereted trong proxy 3,5 WCF:

GetScannedDocumentsAsync GetScannedDocumentsCompleted GetScannedDocumentsEventArgs

Something nói với tôi rằng điều này có thể được thực hiện rất nhiều sạch hơn, tôi đã bỏ lỡ một cái gì đó cruical?

Ngoài ra, phương pháp này có thực thi không đồng bộ không? Biên dịch với toán tử async chỉ tạo ra một lỗi.

+1

Trả về 'GetScannedDocumentsAsync'' IAsyncResult'? Nếu vậy, [this] (http://blogs.msdn.com/b/pfxteam/archive/2011/06/27/10179452.aspx) bài đăng trên blog tuyệt vời mô tả cách thực hiện đúng. – Noseratio

+0

'async' chỉ được phép trên các phương thức có 'đang chờ đợi' bên trong chúng. Định nghĩa của 'GetScannedDocumentsAsync' là gì? –

+0

Nếu bạn nghĩ rằng 'async' là bắt buộc đối với một phương thức để thực sự thực thi không đồng bộ, thì bạn thực sự không hiểu ý nghĩa của' async'. Bạn có lẽ nên đọc thêm về nó. – svick

Trả lời

6

Bạn cũng sẽ nhận được một BeginGetScannedDocumentsEndGetScannedDocuments, bạn có thể bọc bằng cách sử dụng TaskFactory.FromAsync. Tôi có một bài đăng trên blog hiển thị how to use task wrappers with old-school (pre-4.5) WCF (cả trên máy chủ và máy khách).

+0

Với một số trợ giúp từ Skeet tôi đã tìm ra điều này trong một chủ đề khác, điều đơn giản hóa rất nhiều thứ + cho phép tôi sử dụng nhiều thông số tùy ý. Đánh dấu bạn là một câu trả lời cũng mặc dù :) –