gpt4 book ai didi

c# - 将异步操作结果返回给原线程

转载 作者:行者123 更新时间:2023-12-02 11:02:37 25 4
gpt4 key购买 nike

可以得到 async operation 的结果吗?返回到启动它的线程(即在原始线程中调用的AsyncCallback)?

这是一个例子

    void Main(string[] args)
{

Func<bool> action = () =>
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Running");
return true;
};

AsyncCallback onComplete = (r) =>
{
bool result = action.EndInvoke(r);
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Completed");
};

Console.WriteLine(Thread.CurrentThread.ManagedThreadId + ": Main");
IAsyncResult iar = action.BeginInvoke(onComplete, null);
}

它的输出类似于:

5: Main
6: Running
6: Completed

我想要实现的是在主线程中执行的onComplete回调(例如,在此示例中Completed和Main将打印相同的线程ID)

(我知道这可以通过 BackgroundWorker 来实现,即它的 RunWorkerCompleted 事件在原始线程中触发,因此后台调用的函数的返回值线程可以返回到原来的线程)

最佳答案

这很大程度上是您选择使用的 SynchronizationContextTaskScheduler 实现的问题。对于许多 UI 框架(winforms、WPF 等),那么是的:如果您在 UI 线程上开始工作,回调可能会在 UI 线程上发生 - 但这不适用于一般情况,其中 ThreadPool 线程更有可能获胜。最终,您不能简单地将工作强制返回到特定线程,除非该线程有意检查某些工作队列,并在工作包出队时将其出队/执行到达(这正是 UI 框架所做的)。

关于c# - 将异步操作结果返回给原线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32817091/

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