Мне нравится следующий подход, потому что он делает его действительно простым для клиентов.
// your library
class Foo {
public event EventHandler ComputeCompleted = (sender, e) => { };
public void Compute() {
// kick off work on a background thread
// possibly using the BackgroundWorker object
var bw = new BackgroundWorker();
bw.RunWorkerCompleted += RunWorkerCompleted;
bw.RunWorkerAsync();
}
private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
ComputeCompleted(this, new object());
}
}
// calling code
Foo foo = new Foo();
foo.ComputeCompleted += Completed;
foo.Compute();
private void Completed(object Sender, EventArgs e) {
// process the result here
}
Суть в том, что вы запускаете метод в библиотеке, который сразу же возвращается, а затем уведомляет вызывающего по событию / делегату, что обработка завершена.Затем вы можете вызывать выполнение обратно в поток пользовательского интерфейса по мере необходимости.
Очевидно, обработка ошибок не включена в пример кода.