如何在 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

wpf使用mahapps.metro后为啥窗体没有了阴影

下拉选择控件 - Windows 8 Metro - XAML

如何在 Metro (C++/CX) 应用程序中解析日期?

WPF 皮肤之MathApps.Metro UI库

Metro / Windows Store App:相对图像源绑定不起作用?