Вы почти у цели. Несколько изменений, и ваша программа начнет работать асинхронно.
Рекомендованные изменения:
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));
});
Запишите дополнительные журналы, которые сделают очевидным, что программа работает асинхронно.