Вопрос по асинхронности
От: snaphold  
Дата: 29.01.17 10:35
Оценка:
Есть такое вот простое приложение.
Хочу понять именно с асинхронностью поиграть

не пойму как продолжить выполнение в методе 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");
        }
    }
}
Отредактировано 29.01.2017 12:12 AndrewVK . Предыдущая версия .
async
Re: Вопрос по асинхронности
От: _NN_ www.nemerleweb.com
Дата: 29.01.17 11:42
Оценка:
Здравствуйте, snaphold, Вы писали:

Может вернуть просто Task и вызват Task.WaitAll ?
Раз уж хочется асинхронности стоит взять Task-и и async/await.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Вопрос по асинхронности
От: snaphold  
Дата: 29.01.17 11:59
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Здравствуйте, snaphold, Вы писали:


_NN>Может вернуть просто Task и вызват Task.WaitAll ?


это да. ставил цель поиграть с асинком

_NN>Раз уж хочется асинхронности стоит взять Task-и и async/await.


framework 4.0
Re[3]: Вопрос по асинхронности
От: _NN_ www.nemerleweb.com
Дата: 29.01.17 12:04
Оценка: +1
Здравствуйте, 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/
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: Вопрос по асинхронности
От: snaphold  
Дата: 29.01.17 13:53
Оценка:
Здравствуйте, _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/

я хотел просто разобраться сам. понятно, что есть либы
Re: Вопрос по асинхронности
От: StatujaLeha на правах ИМХО
Дата: 29.01.17 19:10
Оценка:
Здравствуйте, 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");
        }
    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.