Привет, ребята, я пытался сделать асинхронный подход к моей функции, связанной с процессором, которые вычисляют некоторые совокупные функции. Дело в том, что есть какой-то тупик (я полагаю), потому что время вычисления слишком отличается. Я reallz новичок в этой задаче Параллельный мир, я также читаю статьи Stephem Cleary, но я все еще не уверен во всем аспекте этого асинхронного подхода. Мой код:Асинхронные задачи занимают слишком много времени
private static void Main(string[] args)
{
PIServer server = ConnectToDefaultPIServer();
AFTimeRange timeRange = new AFTimeRange("1/1/2012", "6/30/2012");
Program p = new Program();
for (int i = 0; i < 10; i++)
{
p.TestAsynchronousCall(server, timeRange);
//p.TestAsynchronousCall(server, timeRange).Wait();-same results
}
Console.WriteLine("Main check-disconnected done");
Console.ReadKey();
}
private async Task TestAsynchronousCall(PIServer server, AFTimeRange timeRange)
{
AsyncClass asyn;
for (int i = 0; i < 1; i++)
{
asyn = new AsyncClass();
await asyn.DoAsyncTask(server, timeRange);
//asyn.DoAsyncTask(server, timeRange);-same results
}
}
public async Task DoAsyncTask(PIServer server, AFTimeRange timeRange)
{
var timeRanges = DivideTheTimeRange(timeRange);
Task<Dictionary<PIPoint, AFValues>>[] tasksArray = new Task<Dictionary<PIPoint, AFValues>>[2];
tasksArray[0] = (Task.Run(() => CalculationClass.AverageValueOfTagPerDay(server, timeRanges[0])));
// tasksArray[1] = tasksArray[0].ContinueWith((x) => CalculationClass.AverageValueOfTagPerDay(server, timeRanges[1]));
tasksArray[1] = (Task.Run(() => CalculationClass.AverageValueOfTagPerDay(server, timeRanges[1])));
Task.WaitAll(tasksArray);
//await Task.WhenAll(tasksArray); -same results
for (int i = 0; i < tasksArray.Length; i++)
{
Program.Show(tasksArray[i].Result);
}
}
измеряю время Повсеместно Секундомер в функциях AverageValueOfTagPerDay. Эта функция синхронна (это проблема?). Каждая задача занимает 12 секунд. Но когда я раскомментировал строку и использовал метод ContinueWith(), эти Задачи занимают 5-6 секунд каждый (что желательно). Как это возможно? Более странно то, что когда я устанавливаю цикл for в Main() на 10, иногда это занимает 5 секунд, а также когда я использую ContinueWith(). Поэтому я предполагаю, что где-то тупик, но я не могу это найти. Извините за английский, у меня все еще проблема, создающая хорошие обратные отсчеты, когда я пытаюсь объяснить некоторые трудности. Приветствие UPDATE я удалил попробовать, который является устаревшим для большей ясности
вы понимаете, что ваш сначала для следующего будет выполнение каждой итерации последовательно. Почему бы не использовать forparallel? –
DoAsyncTask является неполным: 'try' без' catch' и 'finally'. Он помечен как 'async', но не использует' await'. У вас есть несколько задач с использованием одного и того же экземпляра 'PIServer', является ли этот класс потоком безопасным? – Guillaume
поэтому он даже не компилируется. AsyncTask не должен быть асинхронным. –