#c# #multithreading #freeze
#c# #многопоточность #замораживание
Вопрос:
У меня есть программа, написанная на C #, она выполняет много операций чтения из файлов с диска, а затем выводит несколько строк текста, не более 100, в текстовые файлы.
Программа зависает примерно на полпути, я новичок в c # и программировании в целом, из исследований кажется, что мне нужно использовать отдельный поток от того, который управляет формой. Два вопроса,
-
Должен ли я использовать новый поток для чтения и новый для записи или только один для функции чтения?
-
Каков был бы наилучший способ сделать это?
Я надеюсь, что это имеет смысл, и я действительно ценю вашу помощь!
Комментарии:
1. Это приложение Windows forms или WPF?
2. Это также можно довольно легко сделать, используя threadqueue. Просто вызовите EnqueueWorkerItem с новым режимом чтения / записи, и он автоматически будет выполнен вовремя. Хотя это может быть излишним.
3. Вы задали 7 вопросов в Stackoverflow, но выбрали только один ответ и не набрали голосов. Выберите ответы и отдайте голоса соответствующим образом. Если вы ни от кого не получили правильного ответа. Ответьте на свой собственный вопрос и выберите его в качестве ответа. Это помогло бы другим, кто приходит сюда, чтобы найти решения.
Ответ №1:
BackgroundWorker — лучшее, что здесь можно использовать. Вот хороший учебник, в котором описаны все его события и свойства.
Вкратце, это то, что вы должны сделать.
- Создайте фоновый рабочий экземпляр и задайте соответствующие свойства, как вам нужно.
- Добавьте весь код обработки ввода-вывода в DoWork, который будет выполняться в отдельном потоке.
- Добавьте все логические схемы, которые вы хотите выполнить после обработки операции ввода-вывода, в RunWorkerCompleted, который будет выполняться в главном потоке. Здесь вы можете обновить свой пользовательский интерфейс или сделать все, что захотите, в основном потоке. (Вы можете получить доступ к результату через RunWorkerCompletedEventArgs.Свойство результата)
Самое важное, что следует иметь в виду, это то, что события ProgressChanged и RunWorkerCompleted выполняются в главном потоке, где вы можете обновить пользовательский интерфейс, используя результаты фоновой работы. В фоновом потоке выполняется только событие DoWork.
Ответ №2:
Если перед записью должно произойти полное чтение, вам нужен только один поток — в противном случае вы можете использовать два.
Проверьте это для примера многопоточности: http://msdn.microsoft.com/en-us/library/aa645740 (v =против71).aspx
Комментарии:
1. и убедитесь, что вы вызываете Dispose() или «using» для объектов, которые реализуют IDisposable.