2010-05-09 30 views
8

Có cách nào để tôi có thể thực hiện Phương thức tiện ích không đồng bộ không?Làm phương pháp mở rộng Không đồng bộ

Tôi đã xem xét một lúc, nhưng chưa tìm thấy bất kỳ điều gì có liên quan. Sẽ tiếp tục tìm kiếm mặc dù ...

+0

Bạn có ý nghĩa gì về phương pháp không đồng bộ? – Dewfy

Trả lời

10

phương pháp Một phần mở rộng chỉ là một phương pháp tĩnh bình thường, với đường cú pháp để gọi nó.

Vì vậy, hãy tìm hiểu cách bạn thực hiện phương thức bình thường không đồng bộ (ví dụ: bằng cách bắt đầu Tác vụ bên trong nó, trong .NET 4) và đi từ đó.

7

Để thực hiện bất kỳ phương pháp không đồng bộ nào gửi phương thức gọi lại và có phương thức quay một chuỗi mới.

Tôi whipped lên một mẫu ngắn trong .net 3.5 (có thể Jon sẽ chỉ cho chúng ta một mẫu 4.0):

public static void Extension<T>(this T self, AsyncCallback callback) 
    { 
     var state = new State { callback = callback }; 
     System.Threading.ThreadPool.QueueUserWorkItem(ExtensionCore, callback); 
    } 

    private static void ExtensionCore(object state) 
    { 
     // do stuff with OtherStuff 
     var complete = new Complete(); 
     ((State)state).callback(complete); 
    } 

    private class State 
    { 
     public AsyncCallback callback { get; set; } 
     public object OtherStuff { get; set; } 
    } 

    public class Complete : IAsyncResult 
    { 
     public object AsyncState 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public System.Threading.WaitHandle AsyncWaitHandle 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public bool CompletedSynchronously 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public bool IsCompleted 
     { 
      get { throw new NotImplementedException(); } 
     } 
    } 
} 
+0

Cảm ơn bạn đã trả lời câu trả lời của chúng tôi. :) –

2

Trên ghi chú liên quan đến tiếp tuyến, Reactive Extensions for .NET cung cấp các phương pháp mở rộng giúp lập trình không đồng bộ. .NET 4 cũng có Task Parallel Library (mà Jon ám chỉ) có thể giúp song song các hoạt động phổ biến trên các bộ sưu tập và nói chung đơn giản hóa việc truyền bá ngoại lệ (thậm chí gộp các ngoại lệ trên nhiều tác vụ), phối hợp giữa nhiều tác vụ song song phải kết hợp kết quả của chúng, hỗ trợ hủy bỏ và các hành vi tinh vi khác.

4

Tôi nghĩ rằng họ đang cố sửa lỗi này. Thật dễ dàng, đủ để làm việc xung quanh. Đây là cách bạn làm điều đó:

Hãy nói rằng phương pháp async bạn đang cố gắng để làm thành một phần mở rộng trông như thế này:

public static async Task DoAsynchronousWork(this string doWorkTo) 
{ 
    await AnotherAsyncFunctionAsync(doWorkTo); 
    await DoSomeOtherWorkAsync(doWorkTo); 
    await DoMoreWorkAsync(doWorkTo); 
} 

Các VS sẽ không ném một sự phù hợp về vấn đề này, nó sẽ biên dịch bình thường. Tuy nhiên, nếu bạn cố gắng gọi "MyString".DoAsynchronousWork(), nó sẽ phát ra lỗi, nói rằng nó thiếu thông số chuỗi. Vì vậy, nó không hoàn toàn bỏ qua thực tế rằng nó là một phần mở rộng, nhưng nó vẫn đòi hỏi tham số "này"!

May mắn thay, thật dễ dàng để giải quyết vấn đề này. Chỉ cần thay thế DoAsynchronousWork với điều này:

public static Task DoAsynchronousWork(this string doWorkTo) 
{ 
    return new Task(async() => { 
     await AnotherAsyncFunctionAsync(doWorkTo); 
     await DoSomeOtherWorkAsync(doWorkTo); 
     await DoMoreWorkAsync(doWorkTo); 
    }); 
} 

Tôi hy vọng rằng họ nhận được cố định này trước khi họ phát hành NET 4.5, nhưng nếu không, thì ít nhất nó dễ dàng để làm việc xung quanh. (Tôi phát hiện ra rằng lambdas có thể là không đồng bộ do tai nạn, nhưng bây giờ nó đang đến trong VERY tiện dụng!)

+0

Cảm ơn, @ aboveyou00 vì một câu trả lời có giá trị. Upvote từ tôi :-) Chỉ cần cập nhật nhanh cho các nhà nghiên cứu khác; "họ" đã * nhận * lỗ hổng này được sửa trong thời gian cho .NET 4.5, xem ví dụ các phương thức mở rộng không đồng bộ trong [WindowsRuntimeStorageExtensions] (http://msdn.microsoft.com/en-us/library/hh582101.aspx) lớp học. –

Các vấn đề liên quan