Если вы заключите это в вспомогательный класс, вы можете заставить помощника «синхронизировать» ваши значения:
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
}
Edit:
Поскольку вы говорите, что пытаетесь сделать это, чтобы все работало в фоновом потоке, вы можете использовать мой код выше и сделать:
// 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());
Это запустит весь (теперь синхронный) процесс в фоновом потоке и отключит ваш «пульсатор» (из комментария) в потоке пользовательского интерфейса после его завершения.
Если вы управляете всем этим кодом, вы можете сделать процесс преобразования синхронным с самого начала и просто переместить его в фоновый поток, как описано выше, избегая необходимости в обертке.