программа на c # зависает во время чтения / записи

#c# #multithreading #freeze

#c# #многопоточность #замораживание

Вопрос:

У меня есть программа, написанная на C #, она выполняет много операций чтения из файлов с диска, а затем выводит несколько строк текста, не более 100, в текстовые файлы.

Программа зависает примерно на полпути, я новичок в c # и программировании в целом, из исследований кажется, что мне нужно использовать отдельный поток от того, который управляет формой. Два вопроса,

  1. Должен ли я использовать новый поток для чтения и новый для записи или только один для функции чтения?

  2. Каков был бы наилучший способ сделать это?

Я надеюсь, что это имеет смысл, и я действительно ценю вашу помощь!

Комментарии:

1. Это приложение Windows forms или WPF?

2. Это также можно довольно легко сделать, используя threadqueue. Просто вызовите EnqueueWorkerItem с новым режимом чтения / записи, и он автоматически будет выполнен вовремя. Хотя это может быть излишним.

3. Вы задали 7 вопросов в Stackoverflow, но выбрали только один ответ и не набрали голосов. Выберите ответы и отдайте голоса соответствующим образом. Если вы ни от кого не получили правильного ответа. Ответьте на свой собственный вопрос и выберите его в качестве ответа. Это помогло бы другим, кто приходит сюда, чтобы найти решения.

Ответ №1:

BackgroundWorker — лучшее, что здесь можно использовать. Вот хороший учебник, в котором описаны все его события и свойства.

Вкратце, это то, что вы должны сделать.

  1. Создайте фоновый рабочий экземпляр и задайте соответствующие свойства, как вам нужно.
  2. Добавьте весь код обработки ввода-вывода в DoWork, который будет выполняться в отдельном потоке.
  3. Добавьте все логические схемы, которые вы хотите выполнить после обработки операции ввода-вывода, в RunWorkerCompleted, который будет выполняться в главном потоке. Здесь вы можете обновить свой пользовательский интерфейс или сделать все, что захотите, в основном потоке. (Вы можете получить доступ к результату через RunWorkerCompletedEventArgs.Свойство результата)

Самое важное, что следует иметь в виду, это то, что события ProgressChanged и RunWorkerCompleted выполняются в главном потоке, где вы можете обновить пользовательский интерфейс, используя результаты фоновой работы. В фоновом потоке выполняется только событие DoWork.

Ответ №2:

Если перед записью должно произойти полное чтение, вам нужен только один поток — в противном случае вы можете использовать два.

Проверьте это для примера многопоточности: http://msdn.microsoft.com/en-us/library/aa645740 (v =против71).aspx

Комментарии:

1. и убедитесь, что вы вызываете Dispose() или «using» для объектов, которые реализуют IDisposable.