[英]c# many async HttpWebRequest
我嘗試使許多異步HttpWebRequest
。 這是我的測試代碼:
class Program
{
static void Main(string[] args)
{
Test();
Console.ReadLine();
}
public static async void Test()
{
for (int i = 0; i < 10; i++)
{
int val = i;
await Task.Run(() => WR(val));
}
}
static async void WR(int msg)
{
Console.WriteLine(msg + " begin");
string url = "https://stackoverflow.com";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
var response = (HttpWebResponse)await Task.Factory.FromAsync<WebResponse>
(request.BeginGetResponse, request.EndGetResponse, null);
Console.WriteLine(msg + " status code: " + response.StatusCode);
Console.WriteLine(msg + " end");
}
}
結果:
0 begin
1 begin
2 begin
3 begin
4 begin
5 begin
6 begin
7 begin
8 begin
9 begin
0 status code: OK
0 end
1 status code: OK
1 end
1 end
什么也沒發生。 輸出大約30秒后,我可以看到:
The thread 0x6634 has exited with code 0 (0x0).
The thread 0x5620 has exited with code 0 (0x0).
The thread 0x4d08 has exited with code 0 (0x0).
The thread 0x39b8 has exited with code 0 (0x0).
The thread 0x3454 has exited with code 0 (0x0).
The thread 0x99c has exited with code 0 (0x0).
The thread 0x6be0 has exited with code 0 (0x0).
但是也沒有例外,並且控制台沒有關閉。
我的錯誤在哪里?
回答:
不記得response.Dispose();
我已經運行了您的代碼並獲得如下輸出:
0 begin
1 begin
2 begin
3 begin
4 begin
5 begin
6 begin
7 begin
8 begin
9 begin
0 status code: OK
0 end
5 status code: OK
5 end
8 status code: OK
8 end
4 status code: OK
4 end
3 status code: OK
3 end
2 status code: OK
2 end
6 status code: OK
6 end
1 status code: OK
1 end
7 status code: OK
7 end
9 status code: OK
9 end
當您按Enter鍵時,由於Console.ReadLine();
應用程序將關閉Console.ReadLine();
在您的主要方法中。 它等待程序,直到從控制台獲得輸入。
不記得response.Dispose();
static async void WR(int msg)
{
Console.WriteLine(msg + " begin");
string url = "https://stackoverflow.com";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
var response = (HttpWebResponse)await Task.Factory.FromAsync<WebResponse>
(request.BeginGetResponse, request.EndGetResponse, null);
Console.WriteLine(msg + " status code: " + response.StatusCode);
Console.WriteLine(msg + " end");
response.Dispose();
}
我將其設置為自己的靜態方法,該方法將返回字符串,以便您了解發生了什么。 而且我不會依賴任何類型的xml文件,除非它是從API調用返回的XML。 我在這里發布,但如果需要,您可以獲取。 不知道您的設置在后端如何。 核實:
public static string PostXMLDataCS()
{
bool debugging = false;
try
{
string iConnectAuth = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tem=\"http://tempuri.org/\">" +
"<soapenv:Header/>" +
"<soapenv:Body>" +
"<tem:Authenticate>" +
"<!--Optional:-->" +
"<tem:TenantID>TenantID</tem:TenantID>" +
"<!--Optional:-->" +
"<tem:Username>Username</tem:Username>" +
"<!--Optional:-->" +
"<tem:Password>password</tem:Password>" +
"</tem:Authenticate>" +
"</soapenv:Body>" +
"</soapenv:Envelope>";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.example.com/services/ByDesign/Inventory.svc");
byte[] bytes;
bytes = System.Text.Encoding.ASCII.GetBytes(iConnectAuth);
request.ContentType = "text/xml; charset=utf-8";
request.Accept = "gzip,deflate";
request.ContentLength = bytes.Length;
request.Method = "POST";
request.Headers.Add("SOAPAction", "http://tempuri.org/IInventory/Authenticate");
request.KeepAlive = true;
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
HttpWebResponse response;
response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
Stream responseStream = response.GetResponseStream();
string responseStr = new StreamReader(responseStream).ReadToEnd();
response.Close();
//MessageBox.Show(responseStr);
return responseStr;
}
}
catch (Exception e)
{
if (debugging == true)
{
MessageBox.Show("There was a problem authenticating for the check inventory with iConnect. Error: " + e);
}
string messageSubject = "There was a problem authenticating for the check inventory with iConnect.";
string messageBody = "There was a problem authenticating for the check inventory with iConnect. Error: ";
string kiboSendEmail = string.Empty;
SendEmail sendEmail = new SendEmail();
return kiboSendEmail = sendEmail.SendEmailCS(messageSubject, messageBody, e);
}
return null;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.