当前位置:  开发笔记 > 编程语言 > 正文

异步WebRequest冻结应用程序

如何解决《异步WebRequest冻结应用程序》经验,为你挑选了1个好方法。

我正在构建一个具有注册选项的应用程序,并且我已经创建了一种方法来检查用户名是否可用是异步的.方法通过WebRequest连接到我的PHP/MySQL API,并检索是否采用了用户名.

但是,无论何时我尝试运行此代码块都在线

var response = await webRequest.GetResponseAsync();

整个应用程序只是冻结.同样地执行相同的方法可以正常工作.

整个方法:

async public Task usernameAvailable()
{
    try
    {
        token = "token=single";
        function = "&function=checkUser";
        string param = "¶m=" + User.username;

        string result = "";

        var webRequest = WebRequest.Create(@"http://" + APIURL + token + function + param);
        var response = await webRequest.GetResponseAsync(); //troubled line
        var content = response.GetResponseStream();
        StreamReader reader = new StreamReader(content);

        result = reader.ReadLine();

        if (result == "0")
        {
            state = "Username is available.";
            return UsernameAvailable.Available;
        }
        else
        {
            state = "Username is not available.";
            return UsernameAvailable.NotAvailable;
        }
    }
    catch
    {
        state = "Error checking for username.";
        return UsernameAvailable.Error;
    }
}

Yuval Itzcha.. 5

我将在这里疯狂猜测,并说你正在调用的callstack更高usernameAvailable:

usernameAvailable().Result

哪个阻止异步代码,导致您的应用程序死锁.这就是为什么你不应该阻止异步代码.你的答案工作的原因是因为使用ConfigureAwait(false)阻止同步上下文跟随延续,但这只是一个肮脏的解决方法,它掩盖了代码的实际问题.

您也应该使用异步事件处理程序以及await您的方法,而不是这样做:

public async void SomeEventHandler(object sender, EventArgs e)
{
    await usernameAvailable();
}

附注 - 异步方法应该Async添加后缀,因此实际上应该命名您的方法UsernameAvaliableAsync()



1> Yuval Itzcha..:

我将在这里疯狂猜测,并说你正在调用的callstack更高usernameAvailable:

usernameAvailable().Result

哪个阻止异步代码,导致您的应用程序死锁.这就是为什么你不应该阻止异步代码.你的答案工作的原因是因为使用ConfigureAwait(false)阻止同步上下文跟随延续,但这只是一个肮脏的解决方法,它掩盖了代码的实际问题.

您也应该使用异步事件处理程序以及await您的方法,而不是这样做:

public async void SomeEventHandler(object sender, EventArgs e)
{
    await usernameAvailable();
}

附注 - 异步方法应该Async添加后缀,因此实际上应该命名您的方法UsernameAvaliableAsync()

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有