繁体   English   中英

异步调用同步方法

[英]calling a synchronous method asynchronously

我有一个简单的代码,试图在其中更好地了解如何在C#中异步调用方法。

我有一个叫Function1的函数,我想异步运行

static void Function1(out int threadId)
{
    Console.WriteLine("I'm inside Function 1. Going to sleep for 7 seconds...");
    Thread.Sleep(7000);
    Console.WriteLine("I'm awake now");
    threadId = Thread.CurrentThread.ManagedThreadId;
}

然后我有第二个函数Function2,我想正常运行(同步)

static void Function2()
{
    Thread.Sleep(3000);
    Console.WriteLine("I'm inside Function 2");
}

我还创建了一个与Function1具有相同方法签名的委托

delegate void AsyncMethodCaller(out int threadId);

这是我的主要调用方法:

static void Main(string[] args)
{
    int threadId;
    AsyncMethodCaller caller = new AsyncMethodCaller(Function1);
    caller.BeginInvoke(out threadId, null, null);
    Function2();
}

在我的主要方法中,我希望Function1开始异步运行; 然后等待它完成就执行Function2。 所以我期望以下输出:

我在异步函数1中。要睡眠7秒钟...
我在功能2中
我现在醒了

相反,我得到以下输出:

我在异步函数1中。要睡眠7秒钟...
我在功能2中

为什么我的期望与现实不同? 为什么从未达到“我现在醒着”行?

谢谢

.NET的基本进程生存期规则是,所有前台线程都退出后,进程退出。 任何后台线程都会被简单地中止; 该过程不会等待他们。

此外,当您调用委托的BeginInvoke()方法时,这将隐式导致使用线程池调用委托。 线程池完全由后台线程组成。

换句话说,当您调用BeginInvoke() ,您是在告诉.NET使用不会本身保证其寿命的线程来调用委托。 一旦进程的单个主前台线程退出,该线程就可以(在这种情况下)中止Function2()在调用Function2()之后立即发生Function2()

如果希望异步调用的委托正常完成,则必须显式等待。 例如:

IAsyncResult result = caller.BeginInvoke(out threadId, null, null);

Function2();

caller.EndInvoke(out threadId, result);

EndInvoke()方法将阻塞,直到异步调用的委托完成为止,从而允许主线程等待该委托的发生,从而确保在调用完成之前不会中断用于调用委托的线程。

您的代码示例的结构表明您已经看过MSDN的异步调用同步方法 ,但是如果您没有,我将不提及该页面,因为该页面包含许多细节,将有助于解释如何处理该特定问题。场景。

暂无
暂无

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

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