3

我已经以 Windows 形式创建了一个应用程序。一旦我提交申请,申请就会得到处理。我创建了一个类库来处理应用程序并将提交的应用程序移动到不同的工作流程。为此,我从提交按钮的单击事件中调用了类库。一切正常,但唯一的问题是,一旦我提交应用程序并调用类库,处理它需要一些时间。我希望应用程序应该关闭并异步调用库方法。下面是代码:

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), 方法调用类库,我想在异步调用的帮助下执行此操作,以便应用程序在提交后不必等待处理。

我将如何做。请帮忙!

4

7 回答 7

2

异步运行的多种方式,例如 TPL,启动自己的线程(在 4.5 框架中等待),但对于 winforms,可能最简单的方法是添加BackGroundWorker组件。您只需从设计器的工具箱中拖放一个即可。

双击添加的组件,自动创建一个捕获后台工作程序的 DoWork 事件的方法,您可以将代码放在那里。然后在提交按钮中你只需要调用

  backgroundWorker.RunWorkerAsync();
于 2012-06-14T12:39:22.443 回答
2

然后你应该使用 BackgroundWorker 类。

于 2012-06-14T12:39:23.050 回答
2

您可以使用 BackgroundWorker 线程...

BackgroundWorker使线程易于在Windows Forms. 密集型任务需要在另一个线程上完成,以便UI doesn't freeze. 有必要post messages并且update the user interface何时task完成。

使用BackgroundWorker类时,可以在用户界面中指示操作进度、完成和取消。例如,您可以检查后台操作是否是completedcanceleddisplay a message用户。

阅读一个简单的教程

于 2012-06-14T12:41:08.403 回答
0

这是一个很好的例子:

http://www.ricky-dev.com/2012/05/throttled-processing-of-multiple-asynchronous-tasks/

于 2012-06-14T12:43:27.760 回答
0

几种方式。您可以启动一个后台工作线程来调用该进程并在它完成时结束。您可以创建一个委托并使用 BeginInvoke。您可以发送一条消息,服务中的侦听器在派送进程以运行它时接收到该消息。有很多方法可以剥那只猫的皮。

这是一个旧但有用的 MSDN 参考http://msdn.microsoft.com/en-us/magazine/cc301332.aspx

于 2012-06-14T12:43:47.087 回答
0

您只需在单独的线程上启动它。例如:

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

但是,如果您要同时启动多个线程,则应该使用线程池。

不过,你需要小心。您在单独线程上调用的方法无法对 UI 执行任何操作,否则会引发异常。如果它需要对 UI 做一些事情,它将需要一个对表单或控件的引用,以便它可以调用该对象的 Invoke 方法以返回 UI 线程。此外,由于它是异步发生的,因此您将无法在调用它后立即显示该消息框,因为它将在工作完成之前立即显示。

于 2012-06-14T12:46:23.590 回答
0

我希望应用程序应该关闭并异步调用库方法。

如果您想在应用程序关闭之前提交数据,请修改表单即将关闭时处理的事件。请理解此事件仅在用户关闭表单时发生。如果你想覆盖进程何时被迫退出,你必须订阅该事件等等类似的东西。

此外,还有一些方法可以关闭一个进程并且这些事件都不会发生。基本上,此解决方案仅在进程向 Windows 报告它正在关闭时才有效。

当然,如果您的程序进程即将结束,您不应该异步提交数据。

于 2012-06-14T13:35:12.447 回答