Форма ничего не делает (зависает), когда операция занята - PullRequest
2 голосов
/ 05 марта 2012

У меня есть приложение WinForms, использующее C #. Я пытаюсь прочитать некоторые данные из файла и вставить их в таблицу данных. Пока эта операция занята, моя форма зависает, и я не могу переместить ее. Кто-нибудь знает, как я могу решить эту проблему?

Ответы [ 4 ]

9 голосов
/ 05 марта 2012

Это может быть связано с тем, что вы выполняете операцию в потоке пользовательского интерфейса.

Переместите действия «Файл и база данных» в другой поток, чтобы предотвратить замораживание потока в пользовательском интерфейсе.

Вот пример использованияThreadPool.В качестве альтернативы вы можете запускать потоки вручную, но затем вам нужно отслеживать их вручную, если вы, например, хотите прервать их и т. Д.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication1
{
   public partial class Form1 : Form
   {
      public Form1()
      {
         InitializeComponent();
      }

      private void Form1_Load(object sender, EventArgs e)
      {
         // With ThreadPool
         ThreadPool.QueueUserWorkItem(DoWork);
      }

      private void DoWork(object state)
      {
         // Do Expensive Work
         for (int i = 0; i < 100; i++)
         {
            Thread.Sleep(10);
         }
         System.Diagnostics.Debug.WriteLine("DoWork finished!");
      }

   }
}
1 голос
/ 05 марта 2012

Элементы управления, связанные с пользовательским интерфейсом, работают на UI thread, и, как правило, вам не следует выполнять трудоемкую работу с потоком пользовательского интерфейса (если вы это сделаете, ваш поток пользовательского интерфейса будет блокироваться / останавливаться до тех пор, пока эта задача не будет завершена). Существует еще один тип потока под названием Worker Thread, который вы можете создавать и использовать для выполнения долгосрочных задач, которые будут поддерживать или не зависать ваш пользовательский интерфейс. Вот объяснение того, как использовать Threading in Windows Forms.

В качестве альтернативы, в Winforms есть Backgroundworker component, который вы можете использовать для выполнения задач в потоке без пользовательского интерфейса, что объясняется здесь .

1 голос
/ 05 марта 2012

Это потому, что вы используете основной поток для выполнения операций, которые занимают много времени. Лучшее решение - использовать другой поток для чтения нужного вам файла, и это позволит обновлять основной поток как обычно. Читайте здесь больше о темах http://msdn.microsoft.com/en-us/library/aa645740%28v=vs.71%29.aspx

0 голосов
/ 05 марта 2012

Используйте Задачи .т.е.

Task.Factory.StartNew(() => DoAction()).ContinueWith(() => DoAfterActionIsComplete());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...