2011-07-01 19 views

Trả lời

13

Tôi biết bạn nói bạn không muốn viết lại công tác, nhưng bạn thực sự có thể tạo ra một cái gì đó khá đơn giản bằng cách sử dụng các bao đóng, hoạt động giống như một đối tượng Task. Đây là những gì tôi sử dụng:.

public delegate R AsyncTask<R>(); 

    public static AsyncTask<R> BeginTask<R>(AsyncTask<R> function) 
    { 
     R retv = default(R); 
     bool completed = false; 

     object sync = new object(); 

     IAsyncResult asyncResult = function.BeginInvoke(
       iAsyncResult => 
       { 
        lock (sync) 
        { 
         completed = true; 
         retv = function.EndInvoke(iAsyncResult); 
         Monitor.Pulse(sync); 
        } 
       }, null); 

     return delegate 
     { 
      lock (sync) 
      { 
       if (!completed)    
       { 
        Monitor.Wait(sync); 
       } 
       return retv; 
      } 
     }; 
    } 

nó một chức năng mà các cuộc gọi BeginInvoke() trên các đại biểu bạn vượt qua trong, và trả về một chức năng mà khi gọi là khối và chờ đợi kết quả của hàm thông qua vào bạn muốn phải tạo ra quá tải của hàm này cho các chữ ký phương thức khác nhau, tất nhiên.

Một cách để đi, bạn có thể tinh chỉnh điều này theo nhu cầu của mình và thêm các hành vi khác cũng như Tiếp tục, v.v. Điều quan trọng là sử dụng đóng cửa và đại biểu ẩn danh. Nên làm việc trong .NET 2.0.

EDIT - Đây là cách bạn sẽ sử dụng nó:

public static string HelloWorld() 
    { 
     return "Hello World!"; 
    } 

    static void Main(string[] args) 
    { 
     var task = BeginTask(HelloWorld); // non-blocking call 

     string result = task(); // block and wait 

    } 
+0

Cảm ơn Sean. Đây là một điểm khởi đầu tốt. –

+0

Đối với bất kỳ ai đi qua mã, lưu ý BeginInvoke như được sử dụng ở trên bắt đầu HelloWorld trên [một chủ đề mới từ nhóm chủ đề được quản lý] (http://stackoverflow.com/questions/3556634/does-funct-begininvoke-use-the-threadpool). – rkagerer

4

Bạn sẽ phải sử dụng System.Threading.Thread lớp, bạn có thể nhận được các lớp Task cho .net 3.5 nhưng không phải cho .net 2.

Xin lỗi

+0

Tôi đã theo ấn tượng rằng lớp công tác đi kèm với .NET 4. Làm thế nào tôi có thể sử dụng nó dưới 3,5? –

+2

Nhóm [Rx] (http://go.microsoft.com/fwlink/?LinkID=179929) đã quay lại 'Tác vụ' và các trừu tượng mức thấp khác (nhưng không phải toàn bộ TPL) thành .NET 3.5 SP1. –

+0

@Christial Schwarz, ^^ như Stephen đã nói, nó đã được backported. – Jethro

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