Посмотрите на IAsyncResult
- есть много ресурсов, связанных с этим конкретным шаблоном, но в основном это позволит вам поддерживать экземпляр объекта, роль которого он должен позволить вам определить текущее состояниеоперация - или даже вызывать метод End
исключительно для прерывания операции.
Ваши сигнатуры методов могут выглядеть примерно так, например:
public IAsyncResult BeginOperation(AsyncCallback callback)
public EndOperation(IAsyncResult result)
От MSDN :
Интерфейс IAsyncResult реализован с помощью классов, содержащих методы, которые могут работать асинхронно.Это возвращаемый тип методов, которые инициируют асинхронную операцию, например IsolatedStorageFileStream.BeginRead, и передаются методам, которые завершают асинхронную операцию, например IsolatedStorageFileStream.EndRead.IAsyncResult также передается методу, который вызывается делегатом AsyncCallback после завершения асинхронной операции.
Объект, поддерживающий интерфейс IAsyncResult, хранит информацию о состоянии для асинхронной операции и предоставляет объект синхронизации, позволяющий потокамчтобы получить сигнал, когда операция завершится.
РЕДАКТИРОВАТЬ:
ОК, если я что-то упустил, тогда простое уведомление о событии может быть все, что вам нужно здесь- рассмотрим следующее использование класса, представленного ниже:
var flickrOperation = new FlickrOperation();
flickrOperation.FlickrPhotoURLsLoaded +=
delegate(object sender, EventArgs e)
{
var photoCount = flickrOperation.FlickrPhotoURLs.Count;
};
flickrOperation.BeginGetFlickrPhotoURLs();
Теперь давайте определим класс, хотя и примитивный, и просто средство для достижения цели в этом случае.Обратите внимание, в частности, на объявление использования FlickrPhotoURLsLoaded
- это событие, которое вызывается после завершения операции (как продиктовано завершением обратного вызова, загружающего URL-адреса):
class FlickrOperation
{
//the result:
//ultimately, hide this and expose a read only collection or something
public List<string> FlickrPhotoURLs = new List<string>();
//the event:
//occurs when all returns photo URLs have been loaded
public event EventHandler FlickrPhotoURLsLoaded;
public void BeginGetFlickrPhotoURLs()
{
//perform the flickr call...
var getPhotoCollectionCallback = GetFlickrPhotoURLsCallback;
flickr.InterestingnessGetListAsync(getPhotoCollectionCallback);
}
private void GetFlickrPhotoURLsCallback(FlickrResult<PhotoCollection> result)
{
//perform the url collection from flickr result...
FlickrPhotoURLs.Clear();
var photoCollection = (PhotoCollection)result.Result;
foreach (Photo photo in photoCollection)
{
flickrPhotoUrls.Add(photo.MediumUrl);
}
//check to see if event has any subscribers...
if (FlickrPhotoURLsLoaded != null)
{
//invoke any handlers delegated...
FlickrPhotoURLsLoaded(this, new EventArgs());
}
}
}