2012-06-14 6 views
3

Я создал приложение в форме окна. Как только я отправлю заявку, приложение будет обработано. Я создал библиотеку классов, которые обрабатывают приложение и перемещают отправленное приложение в разные рабочие процессы. Для этого я вызвал библиотеку классов из события щелчка кнопки «Отправить». Все работает нормально, но единственная проблема заключается в том, что, как только я отправляю приложение и он вызывает библиотеку классов, требуется некоторое время, когда он его обрабатывает. Я хочу, чтобы приложение закрылось, и он вызывает метод библиотеки асинхронно. Ниже приведен код:Как вызвать метод асинхронно?

private void OnPASubmit_Click(object sender, EventArgs e) 
{ 
    if ((ApplAcct.AcctID == 0) || CheckForChanges()) 
    { 
     UIHelper.ShowMessage("Please Save Application first"); 
     return; 
    } 
    try 
    { 
     if (!AOTHelper.ValidateCheckOut(ApplAcct.AcctID)) 
     { 
      return; 
     } 
     WorkflowTask.PutAccountWorkflowTask(ApplAcct.AcctID, AOTHelper.FindAcctGUID(Main.objAccountGUID, Acct.AcctID), Environment.UserName, 2); 
     AOTHelper.checkInAccount(ApplAcct.AcctID); 
     AOTHelper.AccountToProcess(Acct.AcctID); 
     UIHelper.ShowMessage("Application has been submitted for processing."); 
     this.Close(); 
    } 
    catch (Exception ex) 
    { 
     AOTHelper.WriteLog(ex, "Can not submit application for processing "); 
    } 

    // ... 
} 

AotHelper.AccountToProcess (Acct.AcctID), метод вызывает библиотеку классов, и я хочу сделать это с помощью Asunchronous вызова, так что приложение не нужно ждать после того, как он будет отправлен.

Как это сделать. Пожалуйста помоги!

+0

Несколько часов назад ответил аналогичный вопрос - http://stackoverflow.com/a/11033200/763026. –

+0

PLZ принять хотя бы один ответ, если проблема решена – Talha

ответ

2

Несколько способов запускать асинхронный, например, TPL, начиная свой собственный поток (и в ожидании версии 4.5), но для winforms, возможно, самый простой способ - добавить компонент BackGroundWorker. Вы можете просто перетащить его из панели инструментов на своем дизайнере.

Двойной щелчок по добавленному компоненту автоматически создает метод, который ловит событие DoWork для рабочего стола, вы можете разместить там свой код. Затем в кнопку «Отправить» вы должны позвонить только

backgroundWorker.RunWorkerAsync(); 
+0

Большое вам спасибо ... Это сработало. Спасибо за помощь –

2

Тогда вы должны использовать класс BackgroundWorker.

2

Вы можете использовать BackgroundWorker нить ...

BackgroundWorker делает нити легко реализовать в Windows Forms. Интенсивные задачи нужно делать на другом потоке, чтобы UI doesn't freeze. Необходимо, чтобы post messages и update the user interface, когда сделано task.

Если вы используете класс BackgroundWorker, вы можете указать ход работы, завершение и отмену в пользовательском интерфейсе. Например, вы можете проверить, является ли фоновая операция completed или canceled и display a message.

Read a simple tutorial

+0

Спасибо! Это сработало –

+0

Добро пожаловать :) – Talha

0

Несколько способов. Вы можете запустить фоновый рабочий поток, который вызывает этот процесс и заканчивается только после его завершения. Вы можете создать делегат и использовать BeginInvoke. Вы можете отправить сообщение о том, что слушатель в сервисе выбирает процесс, чтобы запустить его. Много способов кожи, что кошка.

Вот старый, но полезная ссылка MSDN http://msdn.microsoft.com/en-us/magazine/cc301332.aspx

0

Вам просто нужно, чтобы запустить его в отдельном потоке. Например:

Thread thread = new Thread(new ParameterizedThreadStart(AOTHelper.AccountToProcess)); 
thread.Start(Acct.AcctID); 

Если вы собираетесь начинать много потоков, в то же время, однако, вы должны использовать пул потоков, вместо этого.

Вы должны быть осторожны. Метод, который вы вызываете в отдельном потоке, не может ничего сделать с пользовательским интерфейсом, иначе он выдаст исключение. Если ему нужно что-то сделать с пользовательским интерфейсом, ему потребуется ссылка на форму или элемент управления, чтобы он мог вызвать метод Invoke этого объекта, чтобы вернуться к потоку пользовательского интерфейса. Кроме того, поскольку это происходит асинхронно, вы больше не сможете показывать это окно сообщения сразу после его вызова, потому что это будет отображаться непосредственно перед выполнением работы.

+0

Я выберу этот метод из формы окна и после вызова этого метода Thread.Start() я закрою свою форму окна. Не могли бы вы сообщить мне, как и когда этот поток будет удален из памяти. –

+0

Поток будет «уходить», как только будет запущен AOTHelper.AccountToProcess. Как только этот метод попадет в последнюю строку кода в методе или в оператор return, это приведет к завершению потока. –

0

Я хочу, чтобы приложение закрылось, и он вызывает асинхронный метод библиотеки .

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

Кроме того, есть способы закрыть процесс и ни одно из этих событий не произойдет. В основном это решение работает только в том случае, если процесс возвращается к Windows, который закрывается.

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