如何异步调用方法

本文关键字:调用 方法 异步 何异步 | 更新日期: 2023-09-27 18:37:15

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

我将如何做。请帮忙!

如何异步调用方法

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

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

  backgroundWorker.RunWorkerAsync();

然后你应该使用 BackgroundWorker class。

您可以使用

BackgroundWorker 线程...

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

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

阅读简单的教程

这里有一个很好的例子:

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

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

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

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

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

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

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

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

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

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

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