如果您将此内容封装在一个辅助类中,您可以使该辅助类“同步”您的值。
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();
}
}
您可以像这样使用它:
YourClass yourClass = new YourClass();
AsyncWrapper<X,Y> wrapper = new AsyncWrapper<X,Y>();
foreach(X x in theXCollection)
{
Y result = wrapper.Transform(x, yourClass);
}
编辑:
既然你说你想要将所有东西都在后台线程上运行,你可以使用我上面的代码,并进行以下操作:
Task.Factory.StartNew () =>
{
YourClass yourClass = new YourClass();
AsyncWrapper<X,Y> wrapper = new AsyncWrapper<X,Y>();
foreach(X x in theXCollection)
{
Y result = wrapper.Transform(x, yourClass);
}
}).ContinueWith( t =>
{
}, TaskScheduler.FromCurrentSynchronizationContext());
这将在后台线程上启动整个(现在同步的)过程,并在完成后禁用UI线程中的“throbber”(来自评论)。
如果您控制所有这些代码,可以从一开始就使您的Transform过程同步,并将其移入后台线程,避免需要包装器。