2014-09-30 3 views
0

В моем решении у меня есть пользовательский интерфейс, где некоторые слова автоматизации запускается кнопкой button (позволяет вызвать эту кнопку wordStart). Я хочу разбить эту автоматизацию слова с помощью другой кнопки buttonclick (позволяет вызвать эту кнопку wordBreak).Можно ли остановить однопоточное выполнение кода из пользовательского интерфейса?

Однако, когда я нажимаю на wordStart, пользовательский интерфейс зависает во время выполнения работы, и мне не удается щелкнуть по кнопке wordBreak. Я по-прежнему немного новичок в программировании, поэтому для меня это должно быть потому, что приложение однопоточное или, по крайней мере, я могу решить его с помощью многопоточности.

Так что это вопрос 2 в 1. 1. Можно ли остановить выполнение кода с помощью однопоточного приложения? 2. Как остановить выполнение кода?

на вопрос № 2 Я посмотрел немного вокруг в Интернете и нашел эти методы, которые я думаю, будет работать, но и другие предложения приветствуются:

Application.Exit 

Application.Shutdown 

Environment.Exit 

EDIT: Как я подумал, что это должно быть сделано с несколькими резьб. У меня нет такого большого опыта, поэтому я добавил этот код к вопросу, если кто-то хотел бы помочь мне здесь. Тем временем я буду искать решение для этого сам.

private void generateButton_Click(object sender, EventArgs e) 
    { 
     //Thread or backgroundworker should handle this event? 
     commandsChosed(); //Event to be throwed - this starts the word automation 
    } 

    private void stopButton_Click(object sender, EventArgs e) 
    { 
     //Stop/pause the working thread 
    } 
+0

Вы не можете сделать это на однопоточном, и поэтому многопоточность - это путь. Методы, о которых вы говорите, не имеют никакого отношения к тому, чего вы пытаетесь достичь! Если вы используете версию 4 или выше .NET, вы можете посмотреть TPL (Tasks), чтобы упростить многопоточность. http://msdn.microsoft.com/en-us/library/dd537609(v=vs.110).aspx – Belogix

+0

Запустите новый поток при нажатии кнопки, http://msdn.microsoft.com/en-in/library /aa645740(v=vs.71).aspx – CodingDefined

+0

Можете ли вы показать свой код? –

ответ

0

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

+0

Как я и думал, хотя я надеялся, что это можно сделать с помощью одной нити. Теперь я должен пересмотреть архитектуру своей программы. –

+1

Если вы пытаетесь направить кого-то, кто изучает многопоточность и асинхронное программирование в правильном направлении, задача Parallel Library является более разумным выбором, потому что она определенно никуда не собирается в ближайшее время (в отличие от «BackgroundWorker», который уже был удален из PCL и Приложения Windows Store AFAIK). –

+0

@KirillShlenskiy, где вы узнали о том, что не можете использовать BW в таких ситуациях? MSDN ничего не говорит по этим линиям. AFAIK и BW, как правило, легче использовать и понимать для новичков по сравнению с TPL. Также обратите внимание, что я поставил BW только в качестве примера, а не окончательное решение. Самая важная часть - это первые 2 предложения. – walther

0

Просто хотел опубликовать свой ответ на свой вопрос здесь, если у кого-то была аналогичная проблема. Как было предложено другими по этому вопросу, я не смог реализовать его с помощью backgroundworker, поскольку он не позволяет выполнять функции OLE, такие как использование буфера обмена и т. Д., Но это специфично для обработки моего потока. Фоновый работник определенно может быть полезен во многих ситуациях, но он не может быть установлен в STA, поскольку он из потока.

Thread workerThread; 

private void generateButton_Click(object sender, EventArgs e) 
    { 
     generateButton.Visible = false; 
     stopButton.Visible = true; 

     //Setting up a background thread 
     workerThread = new Thread(new ThreadStart(handleGenerateButtonClick)); 
     workerThread.SetApartmentState(ApartmentState.STA); //In STA state the thread can use OLE functions like clipboard and handle some UI components as well. 
     workerThread.IsBackground = true; //It shuts down if the mainthread shuts down 
     workerThread.Start(); 

     try 
     { 
      //Checking whether the currentThread is not the workerThread before blocking the currentThread until workerThread has terminated 
      if (Thread.CurrentThread != workerThread) 
      { 
       //Wait until workerThread has terminated 
       workerThread.Join(); 
      } 
      //Sets the window buttons after workerThread has finished 
      if (!workerThread.IsAlive) 
      { 
       generateButton.Visible = true; 
       stopButton.Visible = false; 
      } 
     } 
     catch 
     { 
     } 
    } 

    private void stopButton_Click(object sender, EventArgs e) 
    { 
     generateButton.Visible = true; 
     stopButton.Visible = false; 

     //Stops the worker thread 
     workerThread.Abort(); 
    } 
Смежные вопросы