Поскольку вы используете .Net 4.0, вы можете воспользоваться библиотекой параллельных задач.
Вот очень простая программа, которая показывает, как использовать TaskCompletionSource
:
public class Test
{
public void Go()
{
ThreadPool.QueueUserWorkItem((z) => this.Imp());
}
private void Imp()
{
Console.WriteLine("Asynchronous operation in progress (1/2)...");
Thread.Sleep(2000);
Console.WriteLine("Asynchronous operation in progress (2/2)...");
if (this.Done != null)
{
this.Done(this, EventArgs.Empty);
}
}
public event EventHandler Done;
}
internal class Program
{
private static void Main(string[] args)
{
Test test = new Test();
TaskCompletionSource<object> tcs = new TaskCompletionSource<object>(null);
Console.WriteLine("Starting asynchronous operation");
Task.Factory.StartNew(() =>
{
test.Done += (sender, e) => tcs.SetResult(null);
test.Go();
});
// Blocking until completion of the async operation
var tmp = tcs.Task.Result;
Console.WriteLine("Asynchronous operation completed");
Console.ReadKey();
}
}
Результат:
Starting asynchronous operation
Asynchronous operation in progress (1/2)...
Asynchronous operation in progress (2/2)...
Asynchronous operation completed
Как видите, поток выполнения блокируется до тех пор, пока не прекратится асинхронная операция.