如何在 C#/XAML Metro App 中使用 HttpWebRequest(或)HttpClient 进行同步服务调用?
Posted
技术标签:
【中文标题】如何在 C#/XAML Metro App 中使用 HttpWebRequest(或)HttpClient 进行同步服务调用?【英文标题】:How to Make a Synchronous service Call using HttpWebRequest (or) HttpClient in C#/XAML Metro App? 【发布时间】:2013-10-16 06:08:11 【问题描述】:我正在开发一个 C#/Xaml Metro 应用程序,根据要求,我想要一个同步服务调用,而不是同步服务调用。
这是我用于异步操作的但我想进行同步服务调用:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://xxxxxxx");
request.Method = "POST";
request.Credentials = new NetworkCredential("xxx", "xxx");
using (Stream requestStream = await request.GetRequestStreamAsync())
如何在 C#/XAML Metro App 中使用 HttpWebRequest 或 HttpClient 进行同步服务调用?
【问题讨论】:
这是我要求的一部分,可以让我知道怎么做,或者让我知道如何等到异步调用完成(除了使用 await )?我想完全等待并且在异步调用完成之前不做任何操作。 ?? 你应该使用异步。这是一个更好的模型,意味着您的应用程序不太可能对用户感到“锁定”和无响应。添加用于“身份验证”的 UI 而不是同步 【参考方案1】:我使用这种方法是因为它允许在等待之前做其他工作:
var t = request.GetRequestStreamAsync();
//do other work here
t.Wait();
using (Stream requestStream = t.Result)
【讨论】:
【参考方案2】:做较小的改变。代替await request.GetRequestStreamAsync()
,使用request.GetRequestStreamAsync().Result
。
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://xxxxxxx");
request.Method = "POST";
request.Credentials = new NetworkCredential("xxx", "xxx");
using (Stream requestStream = request.GetRequestStreamAsync().Result)
更多信息:How would I run an async Task<T> method synchronously?
【讨论】:
【参考方案3】:我正在开发一个 C#/Xaml Metro 应用程序,根据要求,我想要一个同步服务调用,而不是同步服务调用。
正确的解决办法是改变“要求”。 Metro 应用程序应该是异步,而不是同步。如果您开发具有同步 UI 的 Metro 应用程序(这很困难但可能),它很可能会被应用商店拒绝。
【讨论】:
以上是关于如何在 C#/XAML Metro App 中使用 HttpWebRequest(或)HttpClient 进行同步服务调用?的主要内容,如果未能解决你的问题,请参考以下文章
.Net Metro App 中的 MarkUpExtension