单击按钮时调用异步方法

多尼约尔·尼约佐夫

我创建了Windows Phone 8.1项目,并尝试在按钮单击时运行异步方法GetResponse(string url),并等待该方法完成,但是该方法从未完成。这是我的代码:

private void Button_Click(object sender, RoutedEventArgs 
{
      Task<List<MyObject>> task = GetResponse<MyObject>("my url");
      task.Wait();
      var items = task.Result; //break point here
}

public static async Task<List<T>> GetResponse<T>(string url)
{
    List<T> items = null;
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);

    var response = (HttpWebResponse)await Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null);
    try
    {
        Stream stream = response.GetResponseStream();
        StreamReader strReader = new StreamReader(stream);
        string text = strReader.ReadToEnd();
        items = JsonConvert.DeserializeObject<List<T>>(text);
    }
    catch (WebException)
    {
        throw;
    }
    return items;
}

它将挂在task.Wait()上。

我将按钮单击方法更改为异步,并在异步方法之前使用了await,然后得到了result(await GetResponse<string>("url"))。有什么问题Task<List<string>> task = GetResponse<string>("url")吗?我究竟做错了什么?

谢谢您的帮助!

斯里拉姆·萨克提维(Sriram Sakthivel)

您是经典僵局的受害者。task.Wait()或是task.Result导致死锁的UI线程中的阻塞调用。

不要阻塞UI线程永远不要做。等待它。

private async void Button_Click(object sender, RoutedEventArgs 
{
      var task = GetResponseAsync<MyObject>("my url");
      var items = await task;
}

顺便说一句,你为什么要抓住它WebException并把它扔回去?如果您根本不了解它,那就更好了。两者都一样。

我还可以看到您在GetResponse方法内部将异步代码与同步代码混合在一起StreamReader.ReadToEnd是一个阻止呼叫-您应该使用StreamReader.ReadToEndAsync

Jon所说,还对返回Task或异步以遵循TAP(“基于任务的异步模式”)约定的方法使用“ Async”后缀

解决以上所有问题后,您的方法应类似于以下内容。

public static async Task<List<T>> GetResponseAsync<T>(string url)
{
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
    var response = (HttpWebResponse)await Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null);

    Stream stream = response.GetResponseStream();
    StreamReader strReader = new StreamReader(stream);
    string text = await strReader.ReadToEndAsync();

    return JsonConvert.DeserializeObject<List<T>>(text);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

单击按钮时调用Java方法

来自分类Dev

单击按钮时调用脚本

来自分类Dev

单击按钮时调用PHP函数吗?

来自分类Dev

单击按钮时调用Javascript函数

来自分类Dev

在单击按钮时调用PHP函数吗?

来自分类Dev

Django:单击按钮时调用python函数

来自分类Dev

单击按钮时调用数据表

来自分类Dev

Django - 单击按钮时调用 def?

来自分类Dev

单击所有按钮时调用函数

来自分类Dev

异步方法同时调用 2 次

来自分类Dev

仅当单击按钮时调用方法时,Java Swing GUI才被方法阻止

来自分类Dev

单击按钮时调用控制器方法,无需重定向(Rails 2.3)

来自分类Dev

在JQuery中单击时调用ColdFusion方法

来自分类Dev

如何在按钮单击时调用jquery函数?

来自分类Dev

我如何在按钮单击时调用动作

来自分类Dev

Vue不能在单击按钮时调用外部功能

来自分类Dev

ReactJs:-如何在单击按钮时调用调度

来自分类Dev

在单击按钮时调用函数时的jQuery代码问题

来自分类Dev

如何在按钮单击时调用jquery函数?

来自分类Dev

如何在jQuery中单击按钮时调用函数

来自分类Dev

如何在按钮单击时调用jQuery函数?

来自分类Dev

函数不是在单击按钮时调用的,而是在表单加载时调用的

来自分类Dev

使用android数据绑定在按钮单击时调用方法(已在片段中定义)不起作用。?

来自分类Dev

在页面加载或按钮单击时调用 javascript 函数时自动单击按钮

来自分类Dev

单击按钮时异步方法未运行

来自分类Dev

单击事件时调用作用域方法的角度指令

来自分类Dev

jQuery 在单击不同元素时调用相同的方法

来自分类Dev

仅在单击时调用和执行 rails 方法

来自分类Dev

从片段中按返回按钮时调用哪种方法

Related 相关文章

热门标签

归档