Поговорим про Task и Thread - C#

Узнай цену своей работы

Формулировка задачи:

1) Объекты синхронизации, которые были в Thread актуальны для Task? 2) Изменились ли как-то эти объекты сихронизации (lock, monitor, самфор и мьютекс) в плане производительности? 3) Если я на винформах выполняю какую-то длительную операцию и в этой операции обращаюсь в контролу(прогрессбару), то будет ошибка, так как в потоке нельзя использовать элементы управления. Как это победить? 4) В Таске получают результат таски обычным ретурном. Как в Thread получить результат? Можно ли? Или просто делают глобальную переменную какую-то и ее мониторят? 5) Исключения которые происходят в Thread нельзя перехватить в коде который запустил этот код, а в таске можно. Правда?

Решение задачи: «Поговорим про Task и Thread»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Threading;
 
namespace ConsoleApp779
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Exception error = null;
 
            void OnError(Exception e) => Interlocked.CompareExchange(ref error, e, null);
 
            var myWork = new MyWork(OnError);
            var task = myWork.Do();
            task.IsBackground = true;
            task.Start();
            task.Join();
 
            if (error != null)
                Console.WriteLine(error);
        }
 
        private class MyWork
        {
            private readonly Action<Exception> _onError;
            private Exception _error;
 
            public MyWork(Action<Exception> onError) => _onError = onError;
 
            public Thread Do()
            {
                IEnumerable<Func<TimeSpan>> sleeps = new[]
                {
                    () => TimeSpan.FromSeconds(1),
                    () => TimeSpan.FromSeconds(2),
                    new Func<TimeSpan>(() => throw new Exception("Failed!"))
                };
                var task = new Thread(() =>
                {
                    try
                    {
                        foreach (var element in sleeps)
                        {
                            Thread.MemoryBarrier();
                            if (_error != null) break;
 
                            // simulation of long work
                            Thread.Sleep(element());
                        }
                    }
                    catch (Exception e)
                    {
                        if (Interlocked.CompareExchange(ref _error, e, null) == null)
                            _onError(e);
                    }
                });
 
                return task;
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5
Похожие ответы