Создание асинхронных методов в .NET
От: LoparevSV Россия  
Дата: 29.07.08 03:02
Оценка:
Подскажите, пожалуйста, как создать асинхронный метод в разрабатываемом классе (если можно, с примером на C#).

Единственное, что нашел: http://www.gotdotnet.ru/LearnDotNet/WinForms/609.aspx
но статья уже старая, да и пример неполный.
асинхронность .net
Re: Создание асинхронных методов в .NET
От: RushDevion Россия  
Дата: 29.07.08 06:03
Оценка:
Здравствуйте, LoparevSV, Вы писали:

LSV>Подскажите, пожалуйста, как создать асинхронный метод в разрабатываемом классе (если можно, с примером на C#).


LSV>Единственное, что нашел: http://www.gotdotnet.ru/LearnDotNet/WinForms/609.aspx

LSV>но статья уже старая, да и пример неполный.

Как раз нормальная статья, по-моему.
Собственно основная идея такая: асинхронный метод — это обертка над синхронным,
которая выполняется в отдельном потоке и дергает калбек по завершению.
Т.е. нужно написать синхронный метод, а потом заюзать какой-нибудь из
механизмов .NET (хоть обычные треды, хоть асинхронные делегаты) для его асинхронного выполнения.
Re: Создание асинхронных методов в .NET
От: _FRED_ Черногория
Дата: 29.07.08 06:14
Оценка: +1
Здравствуйте, LoparevSV, Вы писали:

LSV>Подскажите, пожалуйста, как создать асинхронный метод в разрабатываемом классе (если можно, с примером на C#).


Asynchronous Programming Design Patterns
... << RSDN@Home 1.2.0 alpha 4 rev. 1048>>
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Создание асинхронных методов в .NET
От: LoparevSV Россия  
Дата: 29.07.08 09:18
Оценка:
Вот что у меня получилось:

class MyClass
{
public int Sum(int a, int b)
{
Thread.Sleep(5000);
return a + b;
}

public IAsyncResult BeginSum(int a, int b, AsyncCallback callBack)
{
AsyncSumCaller asyncSumCaller = new AsyncSumCaller(Sum);
return asyncSumCaller.BeginInvoke(a, b, callBack, this);
}

public int EndSum(IAsyncResult ar)
{
AsyncSumCaller asyncSumCaller = (AsyncSumCaller)((AsyncResult)ar).AsyncDelegate;
return asyncSumCaller.EndInvoke(ar);
}
}

теперь использование этого класса:

class UseMyClass
{
public static void Main()
{
MyClass myClass = new MyClass();
myClass.BeginSum(2, 3, new AsyncCallback(ReceiveSum));
}

private void ReceiveSum(IAsyncResult ar)
{
test t = (test)ar.AsyncState;
int sum = t.EndSum(ar);
}
}

Поправте, если что не так
Re[3]: Создание асинхронных методов в .NET
От: LoparevSV Россия  
Дата: 29.07.08 09:22
Оценка:
описался в коде...
вот правильный:

class MyClass
{
public int Sum(int a, int b)
{
Thread.Sleep(5000);
return a + b;
}

public IAsyncResult BeginSum(int a, int b, AsyncCallback callBack)
{
AsyncSumCaller asyncSumCaller = new AsyncSumCaller(Sum);
return asyncSumCaller.BeginInvoke(a, b, callBack, this);
}

public int EndSum(IAsyncResult ar)
{
AsyncSumCaller asyncSumCaller = (AsyncSumCaller)((AsyncResult)ar).AsyncDelegate;
return asyncSumCaller.EndInvoke(ar);
}
}

теперь использование этого класса:

class UseMyClass
{
public static void Main()
{
MyClass myClass = new MyClass();
myClass.BeginSum(2, 3, new AsyncCallback(ReceiveSum));
}

private void ReceiveSum(IAsyncResult ar)
{
MyClass myClass = (MyClass)ar.AsyncState;
int sum = MyClass.EndSum(ar);
}
}

Поправте, если что не так
Re[2]: Создание асинхронных методов в .NET
От: LoparevSV Россия  
Дата: 29.07.08 09:29
Оценка:
Во всех примерах рассматривается асинхронный вызов синхронного метода, меня же интересует именно создание асинхронного метода для удобства использования класса.

Вот что у меня получилось: http://www.rsdn.ru/forum/message/3039829.1.aspx
Автор: LoparevSV
Дата: 29.07.08


Поправте, пожалуйста, если что не так.
Re[4]: Создание асинхронных методов в .NET
От: Ziaw Россия  
Дата: 29.07.08 09:35
Оценка:
Здравствуйте, LoparevSV, Вы писали:

LSV>Поправте, если что не так


Не так постят код в форум rsdn =)
нужно использовать теги
[c#]
code
[/c#]

выглядеть будет так:
public static void Main()
{
MyClass myClass = new MyClass();
myClass.BeginSum(2, 3, new AsyncCallback(ReceiveSum));
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1096>>
Re[5]: Создание асинхронных методов в .NET
От: LoparevSV Россия  
Дата: 29.07.08 09:43
Оценка:
Z>Не так постят код в форум rsdn =)
Z>нужно использовать теги
Z>[c#]
Z>code
Z>[/c#]

Спасибо!
Как раз хотел и про это узнать)))
Так а что все-таки насчет содержания?..
Re[4]: Создание асинхронных методов в .NET
От: _FRED_ Черногория
Дата: 29.07.08 09:52
Оценка:
Здравствуйте, LoparevSV, Вы писали:

LSV>вот правильный:


AsyncSumCaller — это что такое?
... << RSDN@Home 1 alpha 3 rev. 0>>
Help will always be given at Hogwarts to those who ask for it.
Re[5]: Создание асинхронных методов в .NET
От: LoparevSV Россия  
Дата: 29.07.08 10:56
Оценка:
_FR>AsyncSumCaller — это что такое?

забыл)) это делегат. Вот еще раз код (надеюсь на это раз полный и без ошибок):

класс:

delegate int AsyncSumCaller(int a, int b);

class MyClass
{
        public int Sum(int a, int b)
        {
            Thread.Sleep(5000);
            return a + b;
        }

        public IAsyncResult BeginSum(int a, int b, AsyncCallback callBack)
        {
            AsyncSumCaller asyncSumCaller = new AsyncSumCaller(Sum);
            return asyncSumCaller.BeginInvoke(a, b, callBack, this);
        }

        public int EndSum(IAsyncResult ar)
        {
            AsyncSumCaller asyncSumCaller = (AsyncSumCaller)((AsyncResult)ar).AsyncDelegate;
            return asyncSumCaller.EndInvoke(ar);
        }
}


использование класса:

class UseMyClass
{
        public static void Main()
        {
            MyClass myClass = new MyClass();
            myClass.BeginSum(2, 3, new AsyncCallback(ReceiveSum));
        }

        private void ReceiveSum(IAsyncResult ar)
        {
            MyClass myClass = (MyClass)ar.AsyncState;
            int sum = myClass.EndSum(ar);
        }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.