Поток перезаписан в асинхронной операции? - PullRequest
0 голосов
/ 28 октября 2019

Ниже приведен фрагмент моего кода, который иногда выдает ошибку из-за отсутствия части потока. Во время отладки я вижу, что поток уже был заменен новым потоком, прежде чем он был обработан, и поэтому, я думаю, только часть потока достигает следующего шага. Я новичок в асинхронных операциях и могу использовать неверную терминологию. Как я понял асинхронность - это не то же самое, что асинхронность.

Ошибка является ошибкой исключения 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;
                                }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...