#c_sharp #wpf #async_await
C# async/await public partial class MainWindow : Window { private static object sync = new object(); public MainWindow() { InitializeComponent(); } private void btnStart_Click(object sender, RoutedEventArgs e) { Random rnd = new Random(); for (int i = 0; i <= 100; ++i) { KeyValuePairpr = new KeyValuePair (i.ToString(), rnd.Next(1251000, 1259999).ToString()); ProcessingTransactionAsync(pr); } } private async void ProcessingTransactionAsync(KeyValuePair trn) { this.WriteLog($"{trn.Key}_{trn.Value}", $"----> 1"); TestResult trnRes = await Task .Run((Func )(() => { this.WriteLog($"{trn.Key}_{trn.Value}", $"----> 2"); return this.ProcessingTransaction(trn); })); } private TestResult ProcessingTransaction(KeyValuePair trn) { this.WriteLog($"{trn.Key}_{trn.Value}", $"----> 3"); //Здесь ещё функции, функции, функции Thread.Sleep(1000); TestResult value = new TestResult(); this.WriteLog($"{trn.Key}_{trn.Value}", $"----> 4"); return value; } #region Additional private void WriteLog(string nameLogFile, string message) { try { string pathToLog = "Log"; if (!Directory.Exists(pathToLog)) Directory.CreateDirectory(pathToLog); string filename = Path.Combine(pathToLog, string.Format("{0}.log", nameLogFile)); string fullText = string.Format("[{0:dd.MM.yyy HH:mm:ss.fff}] {1}\r\n", DateTime.Now, message); lock (sync) File.AppendAllText(filename, fullText, Encoding.GetEncoding("Windows-1251")); } catch { // Перехватываем все и ничего не делаем } } #endregion } На первой итерации в лог пишется сл.: [21.06.2017 16:53:49.998] ----> 1 [21.06.2017 16:53:50.022] ----> 2 При 100 итерации [21.06.2017 16:56:44.937] ----> 1 [21.06.2017 16:56:52.672] ----> 2 Что программа может делать так долго(около 8 секунд) между шагами "----> 1" и "----> 2" на 100 итерации? Можно ли это как-то исправить?
Ответы
Ответ 1
Вы запускаете в цикле одновременно 100 тасков (ProcessingTransactionAsync): вы не дожидаетесь их окончания. Каждый из них запускает внутренний таск через Task.Run на пуле потоков. Пул потоков работает так: если есть свободный поток, то задание выполняется на нём. Если нет, система пытается создать новые потоки до MaxThreads. Если потоков и так слишком много, система думает, что вы просто создаёте задания, не дожидаясь результата, и не создаёт новых потоков, а просто ждёт, пока какой-то из рабочих потоков не освободится, и лишь тогда отдаёт ему задание. Думаю, у вас случилось именно это.
Комментариев нет:
Отправить комментарий