Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
шарпопочитатель
59 / 26 / 7
Регистрация: 31.01.2010
Сообщений: 1,035
1

Поговорим про Task и Thread

09.03.2018, 12:41. Показов 1319. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
1) Объекты синхронизации, которые были в Thread актуальны для Task?
2) Изменились ли как-то эти объекты сихронизации (lock, monitor, самфор и мьютекс) в плане производительности?
3) Если я на винформах выполняю какую-то длительную операцию и в этой операции обращаюсь в контролу(прогрессбару), то будет ошибка, так как в потоке нельзя использовать элементы управления. Как это победить?
4) В Таске получают результат таски обычным ретурном. Как в Thread получить результат? Можно ли? Или просто делают глобальную переменную какую-то и ее мониторят?
5) Исключения которые происходят в Thread нельзя перехватить в коде который запустил этот код, а в таске можно. Правда?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2018, 12:41
Ответы с готовыми решениями:

Как запустить Task в Thread
Есть метод который должен работать в потоке и вне потока. var regionId = comboItems.Value; ...

Аналог Thread.Sleep или Task.Delay
Есть ли какой-нибудь аналог функциям Thread.Sleep или Task.Delay ? Мне необходимо сделать задержку...

Аналог Thread.Sleep в Task
Имеется пример который запускает пару потоков с задержкой. using System; using...

Thread? Task? Background worker?
Доброго вечера/ночи/утра/дня! Снова, наверное, глупый вопрос, который не могу решить. Помогите,...

3
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
09.03.2018, 14:03 2
Цитата Сообщение от ht1515 Посмотреть сообщение
1) Объекты синхронизации, которые были в Thread актуальны для Task?
Почему же нет?
Цитата Сообщение от ht1515 Посмотреть сообщение
2) Изменились ли как-то эти объекты сихронизации (lock, monitor, самфор и мьютекс) в плане производительности?
Насколько я помню, были добавлены новые (например, вот).
Цитата Сообщение от ht1515 Посмотреть сообщение
3) Если я на винформах выполняю какую-то длительную операцию и в этой операции обращаюсь в контролу(прогрессбару), то будет ошибка, так как в потоке нельзя использовать элементы управления. Как это победить?
Как и всегда. Через маршалинг в поток UI (через Invoke(), контекст синхронизации). Асинхронные шаблоны позволяют делать это проще).
Цитата Сообщение от ht1515 Посмотреть сообщение
4) В Таске получают результат таски обычным ретурном. Как в Thread получить результат? Можно ли? Или просто делают глобальную переменную какую-то и ее мониторят?
Зависит от задачи. Можно через внешнюю переменную, либо через выброс события изнутри метода, выполняющегося в потоке.
Цитата Сообщение от ht1515 Посмотреть сообщение
5) Исключения которые происходят в Thread нельзя перехватить в коде который запустил этот код, а в таске можно. Правда?
Можно, но есть несколько нюансов.
Ну и в общем-ответы на все эти вопросы довольно хорошо рассмотрены, например, у Албахари. Можете обратиться к его книге напрямую.
1
Warrior
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
09.03.2018, 17:05 3
Thread и Task вообще две разные сущности они между собой никак не связанны.
Thread это объектное представление виндовой сущности потока.
Task это абстракця работы/задачи.

Цитата Сообщение от ht1515 Посмотреть сообщение
5) Исключения которые происходят в Thread нельзя перехватить в коде который запустил этот код, а в таске можно. Правда?
Например использовать замыкания. По такому принципу можно получить и результат задачи.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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;
            }
        }
    }
}
Вложения
Тип файла: zip ConsoleApp779.zip (1.6 Кб, 2 просмотров)
1
шарпопочитатель
59 / 26 / 7
Регистрация: 31.01.2010
Сообщений: 1,035
10.03.2018, 09:31  [ТС] 4
Цитата Сообщение от insite2012 Посмотреть сообщение
Как и всегда. Через маршалинг в поток UI (через Invoke(), контекст синхронизации). Асинхронные шаблоны позволяют делать это проще).
ммм, а можно пример?
0
10.03.2018, 09:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.03.2018, 09:31
Помогаю со студенческими работами здесь

Разница между Task и Thread
в чем разница между задачей и потоком? и то то делает все асинхронно

В чем разница между Task и Thread?
В чем разница между Task и Thread и когда что лучше использовать? Если для написания сервера...

Аналог Task.Wait для Thread
В тасках розпаралеленно следующим образом: Task testlong = new Task(longTest); ...

Дождаться выполнения Task без Thread.Sleep?
using System; public class Test { public static void Main() { Console.WriteLine(&quot;1&quot;);...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru