Есть такое вот простое приложение.
Хочу понять именно с асинхронностью поиграть
не пойму как продолжить выполнение в методе Run, только после окончания WriteCallbackCompleted.
что я не так делаю?
using System;
using System.Threading.Tasks;
namespace MonitorEnterTest
{
class Program
{
static void Main(string[] args)
{
TPL tpl = new TPL();
tpl.Run();
Console.WriteLine("Main completed");
Console.ReadKey();
}
}
class TPL
{
public void Run()
{
AsyncCallback asyncCallback = new AsyncCallback(WriteCallbackCompleted);
IAsyncResult ar = WriteCallbackStarted(asyncCallback);
//Надо дождаться окончания выполнения
}
IAsyncResult WriteCallbackStarted(AsyncCallback ac)
{
var task = Task.Factory.StartNew(() => { });
if (ac != null)
{
task.ContinueWith((r) =>
{
ac(task);
}, TaskContinuationOptions.ExecuteSynchronously);
}
Console.WriteLine("WriteCallbackStarted completed");
return task;
}
void WriteCallbackCompleted(IAsyncResult ar)
{
Console.WriteLine("WriteCallbackCompleted");
}
}
}
Здравствуйте, snaphold, Вы писали:
S>Здравствуйте, _NN_, Вы писали:
_NN>>Здравствуйте, snaphold, Вы писали:
_NN>>Может вернуть просто Task и вызват Task.WaitAll ?
S>это да. ставил цель поиграть с асинком
_NN>>Раз уж хочется асинхронности стоит взять Task-и и async/await.
S>framework 4.0
Для сведения MS его больше не поддерживает
А так есть наработки для использования в 4.0:
https://www.nuget.org/packages/AsyncBridge/
https://www.nuget.org/packages/Microsoft.Bcl.Async/
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, snaphold, Вы писали:
S>>Здравствуйте, _NN_, Вы писали:
_NN>>>Здравствуйте, snaphold, Вы писали:
_NN>>>Может вернуть просто Task и вызват Task.WaitAll ?
S>>это да. ставил цель поиграть с асинком
_NN>>>Раз уж хочется асинхронности стоит взять Task-и и async/await.
S>>framework 4.0
_NN>Для сведения MS его больше не поддерживает
_NN>А так есть наработки для использования в 4.0:
_NN>https://www.nuget.org/packages/AsyncBridge/
_NN>https://www.nuget.org/packages/Microsoft.Bcl.Async/
я хотел просто разобраться сам. понятно, что есть либы
Здравствуйте, snaphold, Вы писали:
Конкретно этот пример можно так. async/await выше посоветовали.
class TPL
{
public void Run()
{
AsyncCallback asyncCallback = new AsyncCallback(WriteCallbackCompleted);
IAsyncResult ar = WriteCallbackStarted(asyncCallback);
//Надо дождаться окончания выполнения
ar.AsyncWaitHandle.WaitOne();
}
IAsyncResult WriteCallbackStarted(AsyncCallback ac)
{
var task = new Task(() => { });
var lastTask = task;
if (ac != null)
{
lastTask = task.ContinueWith((r) => { ac(task); }, TaskContinuationOptions.ExecuteSynchronously);
}
task.Start();
Console.WriteLine("WriteCallbackStarted completed");
//Либо просто task, либо из ContinueWith(если эта задача была добавлена)
return lastTask;
}
void WriteCallbackCompleted(IAsyncResult ar)
{
Console.WriteLine("WriteCallbackCompleted");
}
}