Как исправить deadlock возникающий в коде .net core?

231
19 февраля 2017, 08:16

Есть тестовый код, используется c# azure storage client (последний 8.1.0). Если запускать его как .Net Framework ConsoleApp проблем не возникает, но если запустить как .Net Core ConsoleApp приложение отправляет первую партию сообщений и дальше просто ждёт. Как можно это исправить?

class Program
    {
        static int parallelTasks = 100;
        static int count = 0;
        static void Main(string[] args)
        {
            MainAsync(args).GetAwaiter().GetResult();
        }
        static async Task MainAsync(string[] args)
        {
            var task1 = RunAsync("First task", "messages1", parallelTasks);
            var task2 = RunAsync("Second task", "messages2", parallelTasks);
            await Task.WhenAll(task1, task2);
            Console.WriteLine($"\r\n{task1.Result}\r\n{task2.Result}");
            Console.ReadLine();
        }
        static async Task<string> RunAsync(string name, string queueName, int parallelTasks)
        {
            var account = CloudStorageAccount.DevelopmentStorageAccount;
            var client = account.CreateCloudQueueClient();
            var queue = client.GetQueueReference(queueName);
            await queue.CreateAsync();
            var stopwatch = Stopwatch.StartNew();
            var tasks = new List<Task>();
            for (int i = 0; i < 1000; i++)
            {
                tasks.Add(AddMessageAsync(i, queue));
                while (tasks.Count > parallelTasks)
                {
                    var task = await Task.WhenAny(tasks);
                    tasks.Remove(task);
                }
            }
            await Task.WhenAll(tasks);
            var completed = stopwatch.ElapsedMilliseconds;
            stopwatch.Stop();
            await queue.DeleteAsync();
            return $"{completed} from {name}";
        }
        static async Task AddMessageAsync(int i, CloudQueue queue)
        {
            await queue.AddMessageAsync(new CloudQueueMessage(Encoding.UTF8.GetString(new byte[1024])));
            Interlocked.Increment(ref count);
            Console.Write($"\r{count}");
        }
    }
READ ALSO
Найти высоту заданного узла дерева

Найти высоту заданного узла дерева

Есть для высоты дерева:

224
Сериализация Xml: пустая строка

Сериализация Xml: пустая строка

Имеется следующий код:

260
Нужна помощь, рекурсия [требует правки]

Нужна помощь, рекурсия [требует правки]

Не могу организовать рекурсиюПодскажи, где нужно исправить, чтобы функция правильно работала

235
Как получить int значения из SQL-запроса

Как получить int значения из SQL-запроса

Как получить число (int), полученное в результате такого SQL-запроса:

233