Вы должны думать о проблеме по-другому.Чтобы асинхронные вещи «ощущались» синхронно, самый простой способ сделать это - реструктурировать ваш код, чтобы использовать ' стиль передачи продолжения '.
По сути, вместо вызова функциикоторый возвращает значение, а затем вы обрабатываете это значение, вызываете функцию, передавая ей анонимную функцию в качестве делегата.Затем вызываемая функция вызывает делегата, передавая строку.
Вот пример, в котором используются анонимные функции и лямбда-выражения:
void DoSomethingAsync( Action<string> callback ) {
HttpWebRequest req; // TODO: build your request
req.BeginGetResponse( result => {
// This anonymous function is a closure and has access
// to the containing (or enclosing) function.
var response = req.EndGetResponse( result );
// Get the result string and call the callback
string resultString = null; // TODO: read from the stream
callback(resultString);
}, null );
}
Это половина решения.Следующая часть, это на самом деле назвать это.Представьте, что у вас есть экземпляр ICommand или более простой, событие нажатия кнопки, которое необходимо для вызова этой функции и «получения строки».Вместо «получения строки» вы вызываете эту функцию и предоставляете метод обратного вызова (который будет закрытием).
void btnGo_Click( object sender, EventArgs e ) {
DoSomethingAsync( resultString => {
// This anonymous function is called when the web request has
// finished and has your string.
// Now that we have the string, we can go and process it.
ProcessWebResponseResult( resultString );
});
}
Вот действительно хорошая статья, объясняющая эту концепцию далее: http://blogs.msdn.com/b/wesdyer/archive/2007/12/22/continuation-passing-style.aspx