执行异步post请求时,C#停止工作
我正在开发一个移动应用程序,问题是当我使用Net.Http执行异步请求(PostAsync)时,我的程序停止运行 这是我的请求类,在这里我使用Net.Http执行请求执行异步post请求时,C#停止工作,c#,.net,http,asynchronous,C#,.net,Http,Asynchronous,我正在开发一个移动应用程序,问题是当我使用Net.Http执行异步请求(PostAsync)时,我的程序停止运行 这是我的请求类,在这里我使用Net.Http执行请求 ... namespace BSoft.Requests { public class Requests { public Requests(){} public static string HostName = "https://dev5.360businesssoft.com/";
...
namespace BSoft.Requests
{
public class Requests
{
public Requests(){}
public static string HostName = "https://dev5.360businesssoft.com/";
private static readonly HttpClient httpClient = new HttpClient();
public static async Task<string> PerformPostRequest(Dictionary<string, string> values, string path)
{
string url = HostName + path;
FormUrlEncodedContent content = new FormUrlEncodedContent(values);
HttpResponseMessage response = await httpClient.PostAsync(url, content);
string responseString = await response.Content.ReadAsStringAsync();
return responseString;
}
}
}
。。。
命名空间BSoft.Requests
{
公共类请求
{
公共请求(){}
公共静态字符串主机名=”https://dev5.360businesssoft.com/";
私有静态只读HttpClient HttpClient=新HttpClient();
公共静态异步任务PerformPostRequest(字典值、字符串路径)
{
字符串url=主机名+路径;
FormUrlEncodedContent内容=新的FormUrlEncodedContent(值);
HttpResponseMessage response=等待httpClient.PostAsync(url,内容);
string responseString=wait response.Content.ReadAsStringAsync();
回报率;
}
}
}
这是我的登录类,在这里我调用请求并将结果显示为字符串
...
namespace BSoft.Login
{
public class Login
{
public Login()
{
}
public static void PerformLogin(string username, string password, bool remember)
{
var values = new Dictionary<string, string>();
values.Add("User", username);
values.Add("Password", password);
var ReturnedObj = Requests.Requests.PerformPostRequest(values, "test.php").Result;
System.Diagnostics.Debug.WriteLine(ReturnedObj);
}
}
}
。。。
命名空间BSoft.Login
{
公共类登录
{
公共登录()
{
}
公共静态void PerformLogin(字符串用户名、字符串密码、bool记忆)
{
var值=新字典();
添加(“用户”,用户名);
添加(“密码”,Password);
var ReturnedObj=Requests.Requests.PerformPostRequest(值,“test.php”).Result;
系统.诊断.调试.写线(返回BJ);
}
}
}
试试看
string returnedString = await Requests.Requests.PerformPostRequest(values, "test.php");
试一试
调用
Result
会阻塞gui线程。相反,等待结果:
var ReturnedObj = await Requests.Requests.PerformPostRequest(values, "test.php");
System.Diagnostics.Debug.WriteLine(ReturnedObj);
您对Result
的调用将阻塞gui线程,直到PerformPostRequest
完成,因此在这里使用async
功能没有什么意义。如果确实不希望代码异步执行,那么最好删除对异步方法的调用,并使调用同步。对Result
的调用会阻塞gui线程。相反,等待结果:
var ReturnedObj = await Requests.Requests.PerformPostRequest(values, "test.php");
System.Diagnostics.Debug.WriteLine(ReturnedObj);
您对Result
的调用将阻塞gui线程,直到PerformPostRequest
完成,因此在这里使用async
功能没有什么意义。如果确实不希望代码异步执行,那么最好删除对异步方法的调用,并使调用同步。如果无法使代码库异步友好,则使用HttpWebRequest之类的同步API,而不是HttpClient。如果无法使代码库异步友好,则使用像HttpWebRequest而不是HttpClient这样的同步API。这可以工作,但我不想在PerformLogin函数中使用async。除了在每个函数中使用async之外,还有其他方法吗?不太可能async/await
通常是“一路向下的海龟”。这可以工作,但我不想在我的PerformLogin函数中使用async。除了在每个函数中使用async,还有其他方法吗?不太可能async/await
通常是“一路向下的海龟”。最好警告签名应该改为async Task
Jorge Aguiar已经回答了这个问题,但是有没有一种方法可以在我的PerformLogin函数中不使用async来修复它?@DariusBuhai-因为您的代码实际上是异步运行的,所以您可以随时调用同步方法,并让gui线程阻止正在发生的调用。这基本上就是你得到的。最好警告一下,签名应该改为async Task
Jorge Aguiar已经回答了这个问题,但是有没有一种方法可以在我的PerformLogin函数中不使用async来修复它?@DariusBuhai-因为您的代码实际上是异步运行的,所以您可以随时调用同步方法,并让gui线程阻止正在发生的调用。这基本上就是你所拥有的。