2013-10-15 1 views
0

У меня есть метод, который идет как это:Что такое синхронный эквивалент источника TaskCompletion <T>?

Task<MyClass> MyMethodAsync() 
{ 
    SendBluetoothMessageAsync(); 
    var tcs = new TaskCompletionSource<MyClass>(); 
    Bluetooth.MessageRecieved += (o, e) => tcs.SetResult(e.SomeProperty); 
    //this removes itself afterwards, but boilerplate removed 
    return await tcs.Task; 
} 

Для моего API, хотя, мне нужно предложить синхронную альтернативу. Поэтому мне нужен объект, который может дождаться сигнала, но может нести объект. AutoResetEvent почти соответствует моим критериям, и это то, что у меня до сих пор:

MyClass MyMethodAsync() 
{ 
    SendBluetoothMessage(); 
    var are = new AutoResetEvent(); 
    Bluetooth.MessageRecieved += (o, e) => are.Set(); //removes itself too 
    return null; //problem: how do I get the result? 
} 

Однако, мне нужно, чтобы получить результат. Я не вижу способа сделать это. Я думал о создании производного EventWaitHandle, но codebehind выглядел явно странно, поэтому я не мог доверять ему. Может ли кто-нибудь подумать о том, как это сделать?

ответ

1

Вы можете просто объявить локальную переменную, установить ее в обратном вызове и вернуть ее.

+0

Это довольно немой. Благодарю. –