在 Xamarin.Forms 应用程序中,我尝试连接到 Exosites api(它不是项目的一部分,因此我无法更改 SignalR 左右的那个)。
对于“正常”请求,这一切都很好。
api 还支持长轮询请求 - 在手册中它说客户端必须为请求设置标头“Request-Timeout”。
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, requestUri);
request.Headers.Add("Request-Timeout", "10000");
var response = await client.SendAsync(request);
Run Code Online (Sandbox Code Playgroud)
但是这样做,我没有得到任何答复,即使我将超时设置为非常小的值,例如 1 (ms)。如果我对 Exosites 上的另一个端点的请求设置超时,但它没有检查它,它工作正常。发送没有“Request-Timeout”标头的完全相同的请求也可以正常工作。
有没有人有使用 HttpClient 在 Xamarin 中进行长轮询调用的经验?
非常感谢!
切格
我已经发布了关于异步等待的各种文章,我试图理解等待异步的深度.我的问题是,我发现等待异步方法不会创建一个新线程,而只是让UI响应.如果它是这样的,那么在使用等待异步时没有时间增益,因为没有使用额外的线程.
到目前为止我所知道的是只有Task.Run()创建一个新线程.对于Task.WhenAll()或Task.WhenAny(),这也是如此吗?
假设我们有这个代码:
async Task<int> AccessTheWebAsync()
{
using (HttpClient client = new HttpClient())
{
Task<string> getStringTask = client.GetStringAsync("https://docs.microsoft.com");
DoIndependentWork();
string urlContents = await getStringTask;
return urlContents.Length;
}
}
Run Code Online (Sandbox Code Playgroud)
我期待的是:
创建getStringTask任务时,另一个线程将复制当前上下文并开始执行GetStringAsync方法.
在等待getStringTask时,我们将看到其他线程是否已完成其任务,如果不是,则控件将返回AccessTheWebAsync()方法的调用者,直到另一个线程完成其恢复控制的任务为止.
所以我真的不知道在等待任务时如何创建额外的线程.有人可以解释在等待任务时究竟发生了什么吗?
我正在创建一个API,充当应用程序和其他2个API之间的桥梁。我想知道最好的方法是什么。我正在使用HttpClient。该应用程序有近一千个用户。
我阅读了这篇文章https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/。我真的不应该使用using语句吗?我也在做同步api调用。这有什么作用吗?我做的效率高吗?
这是我的代码:
[HttpGet]
[Route("api/apiname")]
public String GetNumberofP([FromUri]GetNumberofPRequest getNPRequest){
var request = JsonConvert.SerializeObject(getNPRequest);
string errorMessage = "";
try{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.gettoken());
var response = httpClient.GetAsync("api/MobileApp/GetNumberP?"
+ "strCardNumber=" + getNPRequest.strCardNumber
+ "&strDateOfBirth=" + getNPRequest.strDateOfBirth).Result;
return response;
}
catch (Exception e){
throw utils.ReturnException("GetNumberofP", e, errorMessage);
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个PCl,我想在其中使用HttpClient进行异步调用.我编码像这样
public static async Task<string> GetRequest(string url)
{
var httpClient = new HttpClient() { MaxResponseContentBufferSize = int.MaxValue };
HttpResponseMessage response = await httpClient.GetAsync(url);
return response.Content.ReadAsStringAsync().Result;
}
Run Code Online (Sandbox Code Playgroud)
但等待显示错误"无法等待System.net.http.httpresponsemessage"之类的消息.
如果我使用这样的代码比一切顺利但不是异步方式
public static string GetRequest(string url)
{
var httpClient = new HttpClient() { MaxResponseContentBufferSize = int.MaxValue };
HttpResponseMessage response = httpClient.GetAsync(url).Result;
return response.Content.ReadAsStringAsync().Result;
}
Run Code Online (Sandbox Code Playgroud)
我只是希望这个方法以异步方式执行.
这是屏幕截图:

c# ×4
asynchronous ×2
.net ×1
asp.net-core ×1
async-await ×1
httpclient ×1
threadpool ×1
xamarin ×1