如何异步调用方法?

时间:2012-06-14 12:36:17

标签: c# winforms

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

我将如何做到这一点。请帮忙!

7 个答案:

答案 0 :(得分:2)

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

双击添加的组件,自动创建捕获backgroundworker的DoWork事件的方法,您可以将代码放在那里。然后在提交按钮中,您只需致电

  backgroundWorker.RunWorkerAsync();

答案 1 :(得分:2)

然后你应该使用BackgroundWorker类。

答案 2 :(得分:2)

您可以使用BackgroundWorker线程...

BackgroundWorker 使线程易于在Windows Forms中实现。需要在另一个线程上完成密集型任务,以便UI doesn't freeze。当post messages完成时,update the user interfacetask是必要的。

使用BackgroundWorker类时,可以在用户界面中指明操作进度,完成和取消。例如,您可以向用户检查后台操作是completed还是canceleddisplay a message

Read a simple tutorial

答案 3 :(得分:0)

答案 4 :(得分:0)

有几种方法。您可以启动一个调用该进程的后台工作线程,并在完成后结束。 您可以创建委托并使用BeginInvoke。 您可以发送一条消息,告知服务中的侦听器在depatches一个进程上运行它。 有很多方法可以给猫皮肤。

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

答案 5 :(得分:0)

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

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

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

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

答案 6 :(得分:0)

  

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

如果要在应用程序关闭之前提交数据,请修改处理表单即将关闭的事件。请理解,只有在用户关闭表单时才会发生此事件。如果你想要在进程被强制退出时进行覆盖,你必须订阅该事件,以及类似的东西。

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

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