gpt4 book ai didi

c# - 异步调用同步方法

转载 作者:行者123 更新时间:2023-11-30 20:36:28 25 4
gpt4 key购买 nike

我有一个简单的代码,我试图在其中更好地理解如何在 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)

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 就会执行。所以我希望得到以下输出:

I'm inside the asynchronous Function 1. Going to sleep for 7 seconds...
I'm inside Function 2
I'm awake now

相反,我只得到以下输出:

I'm inside the asynchronous Function 1. Going to sleep for 7 seconds...
I'm inside Function 2

为什么我的期望与实际不同?为什么“我现在醒了”这一行从未接通?

谢谢

最佳答案

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

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

换句话说,当您调用 BeginInvoke() 时,您是在告诉 .NET 使用线程调用委托(delegate),该线程本身并不能保证其自身的生命周期。一旦进程的单个主前台线程退出,该线程就可以(在本例中是)中止,这在您调用 Function2() 后立即发生。

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

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

Function2();

caller.EndInvoke(out threadId, result);

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

您的代码示例的结构表明您已经查看了 MSDN 的 Calling Synchronous Methods Asynchronously ,但如果您还没有提到该页面,因为它包含许多有助于解释如何处理这种特定情况的详细信息。

关于c# - 异步调用同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36927373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com