Здравствуйте, LoparevSV, Вы писали:
LSV>Подскажите, пожалуйста, как создать асинхронный метод в разрабатываемом классе (если можно, с примером на C#).
LSV>Единственное, что нашел: http://www.gotdotnet.ru/LearnDotNet/WinForms/609.aspx LSV>но статья уже старая, да и пример неполный.
Как раз нормальная статья, по-моему.
Собственно основная идея такая: асинхронный метод — это обертка над синхронным,
которая выполняется в отдельном потоке и дергает калбек по завершению.
Т.е. нужно написать синхронный метод, а потом заюзать какой-нибудь из
механизмов .NET (хоть обычные треды, хоть асинхронные делегаты) для его асинхронного выполнения.
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);
}
}
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);
}
}
Во всех примерах рассматривается асинхронный вызов синхронного метода, меня же интересует именно создание асинхронного метода для удобства использования класса.
забыл)) это делегат. Вот еще раз код (надеюсь на это раз полный и без ошибок):
класс:
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);
}
}