Создание дополнительного асинхронного метода

Есть ли некоторый способ, которым я могу сделать Дополнительный Метод асинхронным?

Я озирался некоторое время теперь, но еще не нашел, что что-либо имело отношение. Будет продолжать смотреть хотя...

9
задан Michael Petrotta 9 May 2010 в 07:57
поделиться

3 ответа

Метод расширения - это обычный статический метод с синтаксическим сахаром для его вызова.

Так что подумайте, как сделать обычный метод асинхронным (например, запустив внутри него Task в .NET 4) и переходить оттуда.

13
ответ дан 4 December 2019 в 08:15
поделиться

Чтобы сделать любой метод асинхронным, отправьте методу обратный вызов и запустите новый поток.

Я сделал небольшой пример в .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(); }
        }
    }
}
7
ответ дан 4 December 2019 в 08:15
поделиться

По касательной, Reactive Extensions for .NET предоставляет методы расширения, которые помогают в асинхронном программировании. В .NET 4 также есть Task Parallel Library (о которой упоминал Джон), которая может помочь с распараллеливанием общих операций над коллекциями и в целом значительно упрощает распространение исключений (даже объединение исключений в нескольких задачах), координацию между несколькими параллельными задачами, которые должны объединить свои результаты, поддержку отмены и других сложных действий.

2
ответ дан 4 December 2019 в 08:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: