javedsmart Ответов: 3

Многопоточность в C# : использование различных нитей для открытия разных форм приложение


Всем Привет,
У меня есть 1 TaskTray Приложение, которое открывает / вызывает различные формы в зависимости от контекстного меню. У меня есть 1 форма, которая выполняет какую-то задачу, связанную с БД, которая требует времени, в течение этого времени я не могу открыть другие формы, для которых я хочу реализовать потоковую обработку (о которой я мало что знаю :)).
кто-нибудь может мне помочь?

Спасибо,

Что я уже пробовал:

Я сделал несколько google по этому поводу, но все они имеют вызовы из основной формы, которая в моем случае является классом, который наследует ApplicationContext.

Michael_Davies

На этом сайте есть много статей по резьбе, просто поместите "формы резьбы" в поле поиска справа вверху, идите и задайте вопрос, если вы застряли.

3 Ответов

Рейтинг:
1

RickZeeland

Я бы рекомендовал прочитать эту статью: .NET Threading Вам Нужно Знать.[^]
Если вы используете более новую версию .NET, вы также можете использовать задачи, я думаю Task.ContinueWith() и Task.IsCompleted это может вас заинтересовать.
Пример:

// Wait on a single task with a timeout specified.
Task taskA = Task.Run( () => Thread.Sleep(2000));
try {
  taskA.Wait(1000);       // Wait for 1 second.
  bool completed = taskA.IsCompleted;
  Console.WriteLine("Task A completed: {0}, Status: {1}",
                   completed, taskA.Status);
  if (! completed)
     Console.WriteLine("Timed out before task A completed.");
 }
 catch (AggregateException) {
    Console.WriteLine("Exception in taskA.");
 }


Предупреждение: если вы хотите изменить элементы управления в другой форме из потока или задачи, вам необходимо использовать InvokeRequired, или ваш код не будет потокобезопасным !


Рейтинг:
1

Mithlesh Shaw

Попробовать это:

new Thread(() => new TestForm().Show()).Start();


Рейтинг:
1

Anton Burdin

Если вам нужно просто выполнить какое-то действие
использовать это

Task.Factory.StartNew(() => Thread.Sleep(1000));

если вам нужно выполнить какое-то действие, а затем вызвать какое-то сообщение в потоке пользовательского интерфейса
Task.Factory.StartNew(() => Thread.Sleep(1000)).ContinueWith(t => MessageBox.Show("Task complite"), TaskScheduler.FromCurrentSynchronizationContext());