Ниже приведен фрагмент моего кода, который иногда выдает ошибку из-за отсутствия части потока. Во время отладки я вижу, что поток уже был заменен новым потоком, прежде чем он был обработан, и поэтому, я думаю, только часть потока достигает следующего шага. Я новичок в асинхронных операциях и могу использовать неверную терминологию. Как я понял асинхронность - это не то же самое, что асинхронность.
Ошибка является ошибкой исключения nullreference и выдается в строке datetime? dttest ... При просмотре xe отображается только первая часть xmldoc. XML существует на веб-сайте, на котором он размещен, и является правильным, включая все информационные элементы на самой веб-странице. Нельзя исключать, что это может быть ошибка в потоке или что поток перезаписывается до его обработки. Вот почему фрагмент кода содержит большую часть кода.
foreach (DataRow row in dt.Rows)
{
try
{
await Task.Delay(100);
url = row["href"].ToString();
k = int.Parse(row["K"].ToString());
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
NetworkCredential nc = new NetworkCredential(customerNC, "");
request.Credentials = nc;
request.Method = "GET";
request.Timeout = 20000;
request.Proxy = null;
request.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
var response = await Policy
.Handle<WebException>()
.WaitAndRetry(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), (Exception, TimeSpan, context) =>
{
MessageBox.Show(Exception.Message);
})
.Execute(async () => (HttpWebResponse)await Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null));
Stream stream = response.GetResponseStream();
StreamReader strReader = new StreamReader(stream);
var text = await strReader.ReadToEndAsync();
XNamespace xlink = "http://www.w3.org/1999/xlink";
XDocument doc = XDocument.Parse(text);
xml = text;
using (SqlConnection connection = new SqlConnection(connectionString))
{
await connection.OpenAsync();
if (k == 1)
{
kid = int.Parse(row["kid"].ToString());
string sql = @" UPDATE dbo." + clientTableID + @"Produkter
SET ProdTrue = 0,
StockTrue = 0,
OptTrue = 0,
CombTrue = 0
WHERE DB_ID = @1
"
;
using (SqlCommand cmd2 = new SqlCommand(sql, connection))
{
cmd2.Parameters.AddWithValue("@1", kid);
await cmd2.ExecuteNonQueryAsync().ConfigureAwait(false);
}
}
foreach (XElement xe in doc.Descendants("product"))
{
DateTime dt3 = DateTime.Now;
SqlDataReader dr;
int id = int.Parse(xe.Element("id").Value);
SqlCommand sqlQuery = new SqlCommand(@"SELECT db_id, lastupd, prodtrue FROM " + clientTableID + @"produkter WHERE EXISTS (SELECT DB_ID WHERE DB_ID = " + id + ")", connection);
DateTime dt2 = DateTime.Now;
int dbid = 0;
int ProdTrue = 0;
DateTime? dttest = Convert.ToDateTime(xe.Element("date_upd").Value);
if (dttest != null)
{
dt3 = DateTime.Parse(dttest.ToString());
}
else
{
dt3 = DateTime.Now;
}
}