2012-04-01 46 views
8

Tôi đang gói thư viện để sử dụng riêng. Để có được một tài sản nhất định, tôi cần phải đợi một sự kiện. Tôi đang cố gắng bọc nó vào một cuộc gọi không đồng bộ.Biến sự kiện thành cuộc gọi không đồng bộ

Về cơ bản, tôi muốn chuyển

void Prepare() 
{ 
    foo = new Foo(); 
    foo.Initialized += OnFooInit; 
    foo.Start(); 
} 
string Bar 
{ 
    return foo.Bar; // Only available after OnFooInit has been called. 
} 

Into này

async string GetBarAsync() 
{ 
    foo = new Foo(); 
    foo.Initialized += OnFooInit; 
    foo.Start(); 
    // Wait for OnFooInit to be called and run, but don't know how 
    return foo.Bar; 
} 

Làm sao này tốt nhất được thực hiện? Tôi chỉ có thể lặp lại và chờ đợi, nhưng tôi đang cố gắng tìm một cách tốt hơn như sử dụng Monitor.Pulse(), AutoResetEvent hoặc cái gì khác.

Trả lời

23

Những nơi mà TaskCompletionSource được phát. Có rất ít chỗ cho từ khóa async mới ở đây. Ví dụ:

Task<string> GetBarAsync() 
{ 
    TaskCompletionSource<string> resultCompletionSource = new TaskCompletionSource<string>(); 

    foo = new Foo(); 
    foo.Initialized += OnFooInit; 
    foo.Initialized += delegate 
    { 
     resultCompletionSource.SetResult(foo.Bar); 
    }; 
    foo.Start(); 

    return resultCompletionSource.Task; 
} 

mẫu sử dụng (với fancy async)

async void PrintBar() 
{ 
    // we can use await here since bar returns a Task of string 
    string bar = await GetBarAsync(); 

    Console.WriteLine(bar); 
} 
+0

Tôi đoán chức năng này có thể được bọc trong một hàm async? Hoặc chỉ cần thêm async vào hàm và trả về resultCompletionSource.Task.Result; điều gì sẽ khiến nó phải đợi? –

+0

điều này có thể được gói trong một chức năng async, cập nhật các mẫu bây giờ – Polity

+0

Chỉ cần nhận thấy, System.Threading.Tasks không có sẵn trên Windows Phone 7 đó là nền tảng mục tiêu của tôi. Có cách nào khác không? (đã tìm thấy [this] (http://www.nuget.org/packages/System.Threading.Tasks) nhưng tôi muốn giảm thiểu phụ thuộc) –

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