Есть ли некоторый способ, которым я могу сделать Дополнительный Метод асинхронным?
Я озирался некоторое время теперь, но еще не нашел, что что-либо имело отношение. Будет продолжать смотреть хотя...
Метод расширения - это обычный статический метод с синтаксическим сахаром для его вызова.
Так что подумайте, как сделать обычный метод асинхронным (например, запустив внутри него Task в .NET 4) и переходить оттуда.
Чтобы сделать любой метод асинхронным, отправьте методу обратный вызов и запустите новый поток.
Я сделал небольшой пример в .net 3.5 (возможно, Джон покажет нам пример в 4.0):
public static void Extension<T>(this T self, AsyncCallback callback )
{
var state = new State { callback = callback };
System.Threading.ThreadPool.QueueUserWorkItem(ExtensionCore, callback);
}
private static void ExtensionCore(object state)
{
// do stuff with OtherStuff
var complete = new Complete();
((State)state).callback(complete);
}
private class State
{
public AsyncCallback callback { get; set; }
public object OtherStuff { get; set; }
}
public class Complete : IAsyncResult
{
public object AsyncState
{
get { throw new NotImplementedException(); }
}
public System.Threading.WaitHandle AsyncWaitHandle
{
get { throw new NotImplementedException(); }
}
public bool CompletedSynchronously
{
get { throw new NotImplementedException(); }
}
public bool IsCompleted
{
get { throw new NotImplementedException(); }
}
}
}
По касательной, Reactive Extensions for .NET предоставляет методы расширения, которые помогают в асинхронном программировании. В .NET 4 также есть Task Parallel Library (о которой упоминал Джон), которая может помочь с распараллеливанием общих операций над коллекциями и в целом значительно упрощает распространение исключений (даже объединение исключений в нескольких задачах), координацию между несколькими параллельными задачами, которые должны объединить свои результаты, поддержку отмены и других сложных действий.