You need to think about the problem differently. To make asynchronous things "feel" synchronous, the easiest way to do it is to restructure your code to make use of 'continuation passing style'.
In essence, instead of calling a function that returns a value and then you process that value, you call a function, passing an anonymous function as a delegate to it. The called function will then invoke the delegate, passing in the string.
Here is an example, which uses anonymous functions and lambdas:
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 );
}
This is one half the solution. The next part, is to actually call this. Imagine you have an ICommand instance or simpler, a button click event that needed to call this function and "get the string". Instead of "getting the string" you call this function and supply a callback method (which will be a closure).
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 );
});
}
Here is a really good article explaining the concept further:
http://blogs.msdn.com/b/wesdyer/archive/2007/12/22/continuation-passing-style.aspx
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…