我正在构建一个具有注册选项的应用程序,并且我已经创建了一种方法来检查用户名是否可用是异步的.方法通过WebRequest连接到我的PHP/MySQL API,并检索是否采用了用户名.
但是,无论何时我尝试运行此代码块都在线
var response = await webRequest.GetResponseAsync();
整个应用程序只是冻结.同样地执行相同的方法可以正常工作.
整个方法:
async public TaskusernameAvailable() { 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()
我将在这里疯狂猜测,并说你正在调用的callstack更高usernameAvailable
:
usernameAvailable().Result
哪个阻止异步代码,导致您的应用程序死锁.这就是为什么你不应该阻止异步代码.你的答案工作的原因是因为使用ConfigureAwait(false)
阻止同步上下文跟随延续,但这只是一个肮脏的解决方法,它掩盖了代码的实际问题.
您也应该使用异步事件处理程序以及await
您的方法,而不是这样做:
public async void SomeEventHandler(object sender, EventArgs e) { await usernameAvailable(); }
附注 - 异步方法应该Async
添加后缀,因此实际上应该命名您的方法UsernameAvaliableAsync()