Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
1

Есть ли разница между способами создания Thread?

15.01.2017, 13:29. Показов 1780. Ответов 10

Author24 — интернет-сервис помощи студентам
Тевирп
будет ли разница
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        // Метод, который планируется выполнять в отдельном потоке.
        static void Method()
        {
            while (true)
            {
                Console.WriteLine(new string(' ', 10) + "Secondary Thread");
            }
        }
 static void Main()
        {
            ThreadStart method = new ThreadStart(Method);
            Thread thread = new Thread(method);
            thread.Start();
}
или так
C#
1
2
3
4
5
6
 static void Main()
        {
           // ThreadStart method = new ThreadStart(Method);
            Thread thread = new Thread(Method);
            thread.Start();
}
Добавлено через 5 минут
разницы в выполнении не вижу, походу её и нет
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.01.2017, 13:29
Ответы с готовыми решениями:

В чем разница между 2 способами создания строки?
Создание строки из составных частей, посредством сложения или через String.Format 1. Какой...

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

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

Есть ли разница между книгами Троелсена C# 5.0 и 6.0?
Или вообще желательно прочитать все книги? и что значит "выучить язык"? сколько % языка нужно...

10
Эксперт .NET
12081 / 8389 / 1282
Регистрация: 21.01.2016
Сообщений: 31,601
15.01.2017, 13:34 2
UseMuse, разницы нет. ThreadStart - делегат, чисто для удобства ("задачи" для исполнения можно в массиве хранить, или, там, как аргумент в метод передать).
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
15.01.2017, 13:45 3
Цитата Сообщение от UseMuse Посмотреть сообщение
будет ли разница
Разница будет, если вы добавите перегрузку метода Method с параметром object.
0
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
16.01.2017, 09:42  [ТС] 4
Цитата Сообщение от kolorotur Посмотреть сообщение
Разница будет, если вы добавите перегрузку метода Method с параметром object.
Можно пример пжлст, если не сложно
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
16.01.2017, 10:03 5
UseMuse, создайте такой метод в дополнение к существующему:
C#
1
2
3
static void Method(object o)
{
}
И попробуйте оба варианта.
0
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
16.01.2017, 12:26  [ТС] 6
kolorotur, так для того, чтобы метод - принимающий параметр запустить в отдельный поток, нужно использовать делегат ParameterizedThreadStart.
Делегат ThreadStart для метода с параметром не подойдёт.


Но так же можно запустить поток и таким образом
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    static void Method(object o)
    {
        while (true)
        {
            Console.WriteLine(new string(' ', 10) + "Secondary Thread");
        }
    }
    static void Main()
    {
       object s = null;
        //ParameterizedThreadStart method = new ParameterizedThreadStart(Method);
        Thread thread = new Thread(Method);
        thread.Start(s);
    }
Тогда вопрос, есть ли разница между запуском потока
C#
1
2
3
4
       object s = null;
        //ParameterizedThreadStart method = new ParameterizedThreadStart(Method);
        Thread thread = new Thread(Method);
        thread.Start(s);
или так
C#
1
2
3
4
        object s = null;
        ParameterizedThreadStart method = new ParameterizedThreadStart(Method);
        Thread thread = new Thread(method);
        thread.Start(s);
где Method
C#
1
2
3
4
5
6
7
    static void Method(object o)
    {
        while (true)
        {
            Console.WriteLine(new string(' ', 10) + "Secondary Thread");
        }
    }
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
16.01.2017, 12:34 7
Лучший ответ Сообщение было отмечено UseMuse как решение

Решение

UseMuse, ну я же выше написал:
Цитата Сообщение от kolorotur Посмотреть сообщение
создайте такой метод в дополнение к существующему
В дополнение к существующему.
Не заменить существующий метод новым, а добавить еще один метод с тем же именем, но с параметром типа object.
Чтобы было два метода.

А потом попробовать оба варианта из первого сообщения, без изменений.
Вот в этом и будет разница.
1
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
16.01.2017, 12:44  [ТС] 8
kolorotur, ошибка на при компиляции, так как не понятно компилятору, какой метод использовать. Спасибо
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static void Method(object o)
    {
        while (true)
        {
            Console.WriteLine(new string(' ', 10) + "Secondary Thread");
        }
    }
    static void Method()
    {
        while (true)
        {
            Console.WriteLine(new string(' ', 10) + "Secondary Thread");
        }
    }
    static void Main()
    {
        object s = null;
        //ThreadStart  method = new ThreadStart(Method);
        Thread thread = new Thread(Method);// ошибка при компиляции, так как не понятно компилятору, какой метод использовать
        thread.Start();
    }
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
16.01.2017, 12:54 9
Цитата Сообщение от UseMuse Посмотреть сообщение
ошибка на при компиляции, так как не понятно компилятору, какой метод использовать.
Совершенно верно — в этом и есть разница.
Если вы создаете делегат явно, то компилятору надо лишь подобрать соответствующую перегрузку конструктора Thread.
Если вы передаете в конструктор имя метода, то перед тем, как определить нужную перегрузку конструктора, компилятору нужно сначала определить подходящий тип делегата (делегат создается за вас компилятором), который определяется по наиболее подходящей сигнатуре одной из перегрузок метода.
В данном случае у компилятора получается две лучших перегрузки (алгоритм определения лучшей перегрузки в деталях описан в спеках языка), т.к. нет никаких причин считать один вариант лучше другого, что и приводит к ошибке.

Получается, что явное создание делегата нужно использовать тогда, когда существует несколько конфликтующих перегрузок метода. Если таковых не имеется, то можно просто использовать имя метода и предоставить компилятору самому подобрать подходящий тип делегата.
0
159 / 147 / 59
Регистрация: 11.01.2016
Сообщений: 1,297
16.01.2017, 12:59  [ТС] 10
При использовании делегата, ошибки не будет, так как делегат содержит в себе адрес метода
C#
1
2
3
        ThreadStart  method = new ThreadStart(Method);
        Thread thread = new Thread(method );// profit 
        thread.Start();
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
16.01.2017, 13:15 11
Цитата Сообщение от UseMuse Посмотреть сообщение
При использовании делегата, ошибки не будет
Верно, о чем выше и написано

Цитата Сообщение от UseMuse Посмотреть сообщение
так как делегат содержит в себе адрес метода
Только не поэтому, а потому что компилятору нет надобности самому подбирать тип подходящего делегата — вы это сделали за него.
1
16.01.2017, 13:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.01.2017, 13:15
Помогаю со студенческими работами здесь

Есть ли логическая разница между а = 1 или а = true?
Здравствуйте! Есть ли логическая разница между, если а = 1 или а = true: а = 1 а = а а = true

Есть ли разница между двумя маленькой разницей программы?
Два варианта программы, результат компиляции программы одинаковый, доказательство на двух...

Разница между ниже приведенными способами маштабирования картинки
есть ли какая нибудь разница между ниже приведенными способами маштабирования картинки? ...

В чём разница между способами добавления изображений в Tkinter
Начала изучать Tkinter, питон 3й версии. Задача: Добавить на фон окна изображение. Не могу найти...


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

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