У меня есть немного кода, который мне нужно запустить в потоке, отличном от графического интерфейса, так как в настоящее время он вызывает зависание формы во время выполнения кода (10 секунд или около того).
Предположим, я никогда не создавал новую тему раньше; Что является простым / базовым примером того, как сделать это в C # и с помощью .NET Framework 2.0 или более поздней версии?
c#
.net
multithreading
p.campbell
источник
источник
Ответы:
Хорошее место для начала чтения - Джо Албахари .
Если вы хотите создать свой собственный поток, это так просто:
источник
IsBackground
значение true. Это, вероятно, не делает то, что вы думаете, что делает. Что он делает, это настраивает, будет ли поток уничтожен, когда все потоки переднего плана умерли, или будет ли поток поддерживать приложение живым. Если вы не хотите, чтобы ваш поток завершался в середине выполнения, не устанавливайтеIsBackground
значение true.BackgroundWorker
кажется лучшим выбором для вас.Вот мой минимальный пример. После того, как вы нажмете кнопку, фоновый рабочий начнет работать в фоновом потоке, а также сообщит о своем прогрессе одновременно. Он также сообщит после завершения работы.
Примечание:
ProgressChanged
илиRunWorkerCompleted
обработчики. Тем не менее, обновление GUI отDoWork
приведет кInvalidOperationException
.источник
ThreadPool.QueueUserWorkItem довольно идеально подходит для чего - то просто. Единственное предостережение - доступ к элементу управления из другого потока.
источник
Быстро и грязно, но сработает
Использование сверху:
простой код:
Я просто бросил это в новое консольное приложение для примера
источник
Вот еще один вариант:
источник
Попробуйте использовать класс BackgroundWorker . Вы даете ему делегаты на то, что запускать, и получать уведомления, когда работа закончена. На странице MSDN есть пример, на который я ссылаюсь.
источник
Если вы хотите получить значение:
источник
Поместите этот код в функцию (код, который не может быть выполнен в том же потоке, что и GUI), и для запуска выполнения этого кода поместите следующее.
Thread myThread= new Thread(nameOfFunction);
workerThread.Start();
Вызов функции start для объекта потока приведет к выполнению вызова вашей функции в новом потоке.
источник
nameOfFunction
в фоновом режиме, а не в текущем потоке графического интерфейса.IsBackground
Свойство определяет , будет ли поток держать приложение в живых или нет: msdn.microsoft.com/en-us/library/...Вот как можно использовать потоки с progressBar, просто чтобы понять, как работают потоки, в форме есть три индикатора progressBar и 4:
источник
Чарльз, твой код (выше) не верен. Вам не нужно вращаться, дождитесь завершения. EndInvoke будет блокироваться, пока не будет получено сообщение WaitHandle.
Если вы хотите заблокировать до завершения вам просто нужно
или в качестве альтернативы
Но какой смысл делать вызовы anyc, если вы блокируете? Вы могли бы также просто использовать синхронный вызов. Лучше было бы не блокировать и передавать лямбду для очистки:
Следует иметь в виду, что вы должны вызывать EndInvoke. Многие люди забывают об этом и в итоге пропускают WaitHandle, так как большинство асинхронных реализаций выпускают дескриптор ожидания в EndInvoke.
источник
Если вы собираетесь использовать необработанный объект Thread, вам нужно установить как минимум значение IsBackground в true, а также установить модель Threading Apartment (возможно, STA).
Я бы порекомендовал класс BackgroundWorker, если вам нужно взаимодействие с пользовательским интерфейсом.
источник
другой вариант, который использует делегаты и пул потоков ...
Предполагая, что GetEnergyUsage - это метод, который принимает DateTime и другой DateTime в качестве входных аргументов и возвращает Int ...
источник
int usageCnt = nrgDel.Invoke(lastRunTime, procDT, null, null);
? Похоже, что он все равно приостанавливает текущий поток со сном ... Я думал, что ничего не поможет с зависанием GUI, если выВ .Net существует множество способов запуска отдельных потоков, каждый из которых имеет свое поведение. Вам нужно продолжить запуск потока после выхода из GUI? Нужно ли передавать информацию между потоком и графическим интерфейсом? Поток должен обновить GUI? Должен ли поток выполнить одну задачу, а затем завершиться или продолжить работу? Ответы на эти вопросы скажут вам, какой метод использовать.
На веб-сайте Code Project есть хорошая статья об асинхронных методах, в которой описаны различные методы и приведен пример кода.
Обратите внимание, что эта статья была написана до того, как в .NET были введены шаблон async / await и Task Parallel Library .
источник
Как: использовать фоновую тему для поиска файлов
Вы должны быть очень осторожны с доступом из других потоков к конкретным графическим интерфейсам (это характерно для многих GUI-инструментариев). Если вы хотите обновить что-то в GUI из потока обработки, проверьте ответ, который, на мой взгляд, полезен для WinForms. Для WPF смотрите это (он показывает, как прикоснуться к компоненту в методе UpdateProgress (), чтобы он работал из других потоков, но на самом деле мне не нравится, что он не делает,
CheckAccess()
прежде чем делатьBeginInvoke
через Dispathcer, смотрите и ищите CheckAccess в нем)Искал конкретную книгу по .NET и нашел эту (бесплатно скачиваемую). См. Http://www.albahari.com/threading/ для получения более подробной информации об этом.
Я полагаю, что вы найдете то, что вам нужно для запуска исполнения в виде нового потока на первых 20 страницах, и у него есть еще много других (не уверен насчет специфических фрагментов GUI, я имею в виду строго специфический для потоков). Был бы рад услышать, что сообщество думает об этой работе, потому что я читаю эту. На данный момент выглядело довольно аккуратно для меня (для показа .NET конкретных методов и типов для многопоточности). Также он охватывает .NET 2.0 (а не древний 1.1), что я действительно ценю.
источник
Я бы порекомендовал взглянуть на Power Threading Library Джеффа Рихтера и, в частности, на IAsyncEnumerator. Взгляните на видео в блоге Чарли Калверта, где Рихтер просматривает его для хорошего обзора.
Не откладывайте на это имя, потому что это облегчает программирование задач асинхронного программирования.
источник