Task.run () для многозадачности запускается - PullRequest
0 голосов
/ 08 февраля 2020

Я хочу запустить более одной задачи одновременно на основе возвращаемого значения. Ниже приведен приблизительный код для того, что я хочу.

    class Program
    {
        static void tempFunc(string username,string password, ref Queue<KeyValuePair<string, string>> queue)
        {
            for(int i=0;i<10;i++)
            {
                Task.Delay(100000);
                Console.WriteLine(username + i);
            }
            queue.Enqueue(new KeyValuePair<string, string>(username, password));
        }
        static void Main(string[] args)
        {
            // A queue which is storing the username and password for different sessions and they need
            // to be passed to the method being called in Tasks.run
            Queue<KeyValuePair<string, string>> queue = new Queue<KeyValuePair<string, string>>();
            queue.Enqueue(new KeyValuePair<string, string>("user1", "password1"));
            queue.Enqueue(new KeyValuePair<string, string>("user2", "password2"));
            queue.Enqueue(new KeyValuePair<string, string>("user3", "password3"));

            while(true)
            {  // Based on the condition mentioned here(this condition is a method in real which returns a list of
               //string, which I will be passing as a parameter to the method being called in Tasks.run but I haven't put that in code here)
               if(condition)
               { 
                   if(queue.Count != 0)
                   {
                       KeyValuePair<string, string> temp = queue.Dequeue();
                       string username = temp.Key;
                       string password = temp.Value;

                       Task.Run(() => tempFunc(username, password, ref queue));
                   }
               }
            }
        }
    }

Идея состоит в том, чтобы иметь пул username и password, когда задача выполнена, она ставит в очередь используемые username и password, чтобы его можно было использовать снова. Может быть несколько задач, и они не зависят друг от друга, т.е. когда одна задача выполняется, другая задача может использовать другой набор username и password и вызывать метод. и все это работает как часть windows service. Проблема, когда я использую упомянутый код, кажется, работает синхронно. т.е. ожидание завершения одной задачи и последующее выполнение другой задачи после этого. Что я делаю неправильно? или я неправильно использую Tasks.run.

1 Ответ

1 голос
/ 08 февраля 2020

Вы почти у цели. Несколько изменений, и ваша программа начнет работать асинхронно.

Рекомендованные изменения:

A) Измените функцию tempFund на aysnc. И нет необходимости включать queue в качестве параметра этой функции. Вы можете добавить пользователя обратно в очередь в вызывающей функции после завершения задачи.

public static async Task tempFunc(string username, string password)
{
    for (int i = 0; i < 10; i++)
    {
        Console.WriteLine("Before work start : {0}", username + i);
        await Task.Delay(2000);  //I have reduced it. OP can use his time
        Console.WriteLine("After work complete : {0}", username + i);
    }
}

B) Используйте ConcurrentQueue для поточно-ориентированных операций. То же самое было предложено Джонсом.

//Use ConcurrentQueue

var queue = new ConcurrentQueue<KeyValuePair<string, string>>();

C) Измените блок if следующим образом:

  if (queue.Count != 0)
  {
      var temp = new KeyValuePair<string, string>();
      queue.TryDequeue(out temp);
      string username = temp.Key;
      string password = temp.Value;

      Task.Run(async () =>
      {
          Console.WriteLine("before Task start : {0}", username);
          await tempFunc(username, password);
          Console.WriteLine("after Task Ends : {0}", username);
          queue.Enqueue(new KeyValuePair<string, string>(username, password));
      });

Запишите дополнительные журналы, которые сделают очевидным, что программа работает асинхронно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...