为 Windows Phone 7 的 WebRequest 增加同步方法
openkk
13年前
<p>我真的很喜欢开发 Windows Phone 7 程序。像 Visual Studio 和 Blend 都是优良的工具,而 Silverlight 和 XNA 是很好的框架。只能有一个很大的烦恼,就是 WebRequest 不支持同步的方法调用。虽然我知道不应该在 UI 线程上做业务处理,但我不喜欢微软限定的这么死,作为一名开发人员,我宁愿自己作出这一选择。</p> <p>我已经创建了2个简单的扩展方法添加到WebRequest的同步行为:</p> <pre class="brush:c#; toolbar: true; auto-links: false;">public static class WebRequestExtensions { public static WebResponse GetResponse(this WebRequest request) { AutoResetEvent autoResetEvent = new AutoResetEvent(false); IAsyncResult asyncResult = request.BeginGetResponse(r => autoResetEvent.Set(), null); // Wait until the call is finished autoResetEvent.WaitOne(); return request.EndGetResponse(asyncResult); } public static Stream GetRequestStream(this WebRequest request) { AutoResetEvent autoResetEvent = new AutoResetEvent(false); IAsyncResult asyncResult = request.BeginGetRequestStream(r => autoResetEvent.Set(), null); // Wait until the call is finished autoResetEvent.WaitOne(); return request.EndGetRequestStream(asyncResult); } }</pre> <p></p> <p>请注意:使用 AutoResetEvent 会导致一些性能方面的损耗,因此上述代码运行起来其一个真正的同步方法实现要低效。</p> <p>注意2:我知道你可以从一个 IAsyncResult 对象获取一个 WaitHandle,但这在 WP7 上是不可能的。</p>