Поговорим про 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; } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д