Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行异步post请求时,C#停止工作_C#_.net_Http_Asynchronous - Fatal编程技术网

执行异步post请求时,C#停止工作

执行异步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/";

我正在开发一个移动应用程序,问题是当我使用Net.Http执行异步请求(PostAsync)时,我的程序停止运行

这是我的请求类,在这里我使用Net.Http执行请求

...

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线程阻止正在发生的调用。这基本上就是你所拥有的。