gpt4 book ai didi

c# - 串行调用异步方法

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

我有以下(简化的)异步方法:

void Transform<X,Y>(X x, Action<Y> resultCallback) {...}

我想做的是将 X 列表转换为 Y 列表。

问题是,即使 Transform 方法是异步的,它也必须连续调用(即我必须等待回调,然后再用下一个值调用它)。

有没有办法优雅地做到这一点? (我在 .Net 4.0 上)

我猜可能有一些方法可以通过继续传递来做到这一点......

更新 我忘记指定我不想阻止调用 (GUI) 线程。

最佳答案

如果将其包装在帮助程序类中,则可以使帮助程序“同步”您的值:

public class AsyncWrapper<X,Y>
{
ManualResetEvent mre;
private Y result;

public Y Transform(X x, YourClass yourClass)
{
mre = new ManualResetEvent(false);
result = default(Y);

yourClass.Transform<X,Y>(x, this.OnComplete);
mre.WaitOne();
return result;
}

void OnComplete(Y y)
{
result = y;
mre.Set();
}
}

然后你可以这样使用:

// instance your class with the Transform operation
YourClass yourClass = new YourClass();

AsyncWrapper<X,Y> wrapper = new AsyncWrapper<X,Y>();

foreach(X x in theXCollection)
{
Y result = wrapper.Transform(x, yourClass);

// Do something with result
}

编辑:

既然你说你试图这样做是为了让所有东西都在后台线程上运行,你可以使用我上面的代码,然后:

// Start "throbber"
Task.Factory.StartNew () =>
{
// instance your class with the Transform operation
YourClass yourClass = new YourClass();

AsyncWrapper<X,Y> wrapper = new AsyncWrapper<X,Y>();

foreach(X x in theXCollection)
{
Y result = wrapper.Transform(x, yourClass);

// Do something with result
}
}).ContinueWith( t =>
{
// Stop Throbber
}, TaskScheduler.FromCurrentSynchronizationContext());

这将在后台线程上启动整个(现在是同步的)进程,并在完成后在 UI 线程上禁用您的“throbber”(来自评论)。

如果您控制所有这些代码,您可以使您的转换过程从一开始就同步,并且只需将其移至上述后台线程,而无需包装器。

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

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