繁体   English   中英

如何异步调用方法?

[英]How to call a method Asynchronously?

我已经在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,最简单的方法可能就是添加一个BackGroundWorker组件。 您只需从设计器的工具箱中拖放一个即可。

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

  backgroundWorker.RunWorkerAsync();

然后你应该使用BackgroundWorker类。

你可以使用BackgroundWorker线程......

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

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

阅读一个简单的教程

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

这是一个旧的但有用的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报告它正在关闭时,此解决方案才有效。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM