Асинхронные грабли (тривиальные)
От: Аноним  
Дата: 12.07.10 12:03
Оценка:
Есть класс A реализующий
метод — DoSomething(int number)
событие — DoSomethingFinished

Мне же надо сделать

for(int i=0;i<10;i++)
{
 A.DoSomethingSynchronously(i);
}

Метод DoSomething не содержит возможности передать AsyncCallBack.
Необходимо реализовать последовательное выполнение этих вызовов.
Если кто располагает простым примером — пожалуйста поделитесь.
Предупреждаю сразу: о Power Threading знаю, читал, ничего не понял. Вот это тоже читал:
http://habrahabr.ru/blogs/net/71625/ — пока не помогает
Re: Асинхронные грабли (тривиальные)
От: Lloyd Россия  
Дата: 12.07.10 12:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Необходимо реализовать последовательное выполнение этих вызовов.

А>Если кто располагает простым примером — пожалуйста поделитесь.
А>Предупреждаю сразу: о Power Threading знаю, читал, ничего не понял. Вот это тоже читал:
А>http://habrahabr.ru/blogs/net/71625/ — пока не помогает

Как-то так:
var are = new AutoResetEvent(false);
var a = new A();
a.DoSomethingFinished += delegate {
    are.Set();
};

for (int i = 0; i < 10; i++) {
    a.DoSomething(i);
    are.WaitOne();
}
Re[2]: Асинхронные грабли (тривиальные)
От: _FRED_ Россия
Дата: 12.07.10 12:43
Оценка:
Здравствуйте, Lloyd, Вы писали:

А>>Необходимо реализовать последовательное выполнение этих вызовов.

А>>Если кто располагает простым примером — пожалуйста поделитесь.
А>>Предупреждаю сразу: о Power Threading знаю, читал, ничего не понял. Вот это тоже читал:
А>>http://habrahabr.ru/blogs/net/71625/ — пока не помогает

L>Как-то так:

L>var are = new AutoResetEvent(false);
L>var a = new A();
L>a.DoSomethingFinished += delegate {
L>    are.Set();
L>};

L>for (int i = 0; i < 10; i++) {
L>    a.DoSomething(i);
L>    are.WaitOne();
L>}


Сугобое ИМХО: разница между Auto и Manual не столько в том, что одно из них нужно самому сбрасывать, сколько в том, что первый будит все ждущие потоки, а второй — один. Так как в данном случае ждущий поток — один, то идеологтчески более верно будет использование ManualResetEvent-а.
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Асинхронные грабли (тривиальные)
От: Аноним  
Дата: 12.07.10 12:48
Оценка:
Здравствуйте, _FRED_, Вы писали:

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


Огромное Человеческое Спасибо!
Re[3]: Асинхронные грабли (тривиальные)
От: Lloyd Россия  
Дата: 12.07.10 12:59
Оценка: 20 (1)
Здравствуйте, _FRED_, Вы писали:

_FR>Сугобое ИМХО: разница между Auto и Manual не столько в том, что одно из них нужно самому сбрасывать, сколько в том, что первый будит все ждущие потоки, а второй — один.


Да ну?
var evt = new AutoResetEvent(false);
ThreadPool.QueueUserWorkItem(delegate {
    Console.WriteLine("[{0}] Start", 1);
    evt.WaitOne();
    Console.WriteLine("[{0}] End", 1);
});
ThreadPool.QueueUserWorkItem(delegate {
    Console.WriteLine("[{0}] Start", 2);
    evt.WaitOne();
    Console.WriteLine("[{0}] End", 2);
});

Console.WriteLine("~~~~~");
Thread.Sleep(1000);
evt.Set();
Console.ReadLine();



_FR>Так как в данном случае ждущий поток — один, то идеологтчески более верно будет использование ManualResetEvent-а.


Вывод тоже неверный. Отличие между ними в том, что если у Manual-а ты выставил значение, то он пропускает всех, кто ждал ны событии, в случае же auto — первый прошедший "закрывает за собой проход". То, что ты написал про "будит все потоки" — лишь следствие, а не суть отличия.
Re[4]: Асинхронные грабли (тривиальные)
От: Mr.Cat  
Дата: 12.07.10 13:12
Оценка:
Здравствуйте, Lloyd, Вы писали:
L>в случае же auto — первый прошедший "закрывает за собой проход"
Т.е. Set для AutoResetEvent разбудит все потоки в "очереди", а не только один? Жуть.
Re[5]: Асинхронные грабли (тривиальные)
От: Lloyd Россия  
Дата: 12.07.10 13:15
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

L>>в случае же auto — первый прошедший "закрывает за собой проход"

MC>Т.е. Set для AutoResetEvent разбудит все потоки в "очереди", а не только один? Жуть.

Нет, не разбудит. Я описал "метафору" поведения, для повторения потобного поведения нет необходимости будить все потоки. Но это опять же лишь следствие описанного поведения autoevent-а.
Re[4]: Асинхронные грабли (тривиальные)
От: _FRED_ Россия
Дата: 12.07.10 13:27
Оценка: +1
Здравствуйте, Lloyd, Вы писали:

_FR>>Сугобое ИМХО: разница между Auto и Manual не столько в том, что одно из них нужно самому сбрасывать, сколько в том, что первый будит все ждущие потоки, а второй — один.


L>Да ну?


Чьёрт, перепутал. Тогда, конечно, Auto как раз и нужен.

_FR>>Так как в данном случае ждущий поток — один, то идеологтчески более верно будет использование ManualResetEvent-а.


L>Вывод тоже неверный. Отличие между ними в том, что если у Manual-а ты выставил значение, то он пропускает всех, кто ждал ны событии, в случае же auto — первый прошедший "закрывает за собой проход". То, что ты написал про "будит все потоки" — лишь следствие, а не суть отличия.


Я просто перепутал Auto и Manual (если не чего-то ещё). Конечно же это ручной "будит всех".
Help will always be given at Hogwarts to those who ask for it.
Re[5]: Асинхронные грабли (тривиальные)
От: Аноним  
Дата: 12.07.10 13:31
Оценка:
Вот за такие вот дебаты и люблю RSDN
Re[6]: Асинхронные грабли (тривиальные)
От: _FRED_ Россия
Дата: 12.07.10 13:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вот за такие вот дебаты и люблю RSDN


Я тоже
Help will always be given at Hogwarts to those who ask for it.
Re: Асинхронные грабли (тривиальные)
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 12.07.10 13:57
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть класс A реализующий

А>метод — DoSomething(int number)
А>событие — DoSomethingFinished

А>Мне же надо сделать


А>
А>for(int i=0;i<10;i++)
А>{
А> A.DoSomethingSynchronously(i);
А>}

А>

А>Метод DoSomething не содержит возможности передать AsyncCallBack.
А>Необходимо реализовать последовательное выполнение этих вызовов.
А>Если кто располагает простым примером — пожалуйста поделитесь.
А>Предупреждаю сразу: о Power Threading знаю, читал, ничего не понял. Вот это тоже читал:
А>http://habrahabr.ru/blogs/net/71625/ — пока не помогает

Action<...> handler;
int i = 0;
handler = () => 
{
    if(i<10) { A.DoSomething(i++);}
    else { A.DoSomethingFinished -= handler;}
}
A.DoSomethingFinished += handler;
handler(...);
http://files.rsdn.org/67312/MVP_Horizontal_Mini.png
Re[2]: Асинхронные грабли (тривиальные)
От: Аноним  
Дата: 12.07.10 14:14
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>
G>Action<...> handler;
G>int i = 0;
G>handler = () => 
G>{
G>    if(i<10) { A.DoSomething(i++);}
G>    else { A.DoSomethingFinished -= handler;}
G>}
G>A.DoSomethingFinished += handler;
G>handler(...);
G>


Отсыпте и мне немного

PS:
Если честно — что значит
Action<...> handler;
и вот это
handler = () =>
???
Я то догадываюсь как оно работает, но откуда такая запись вообще имеет право на существование?
Re[3]: Асинхронные грабли (тривиальные)
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 12.07.10 17:35
Оценка:
Здравствуйте, Аноним, Вы писали:

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


G>>
G>>Action<...> handler;
G>>int i = 0;
G>>handler = () => 
G>>{
G>>    if(i<10) { A.DoSomething(i++);}
G>>    else { A.DoSomethingFinished -= handler;}
G>>}
G>>A.DoSomethingFinished += handler;
G>>handler(...);
G>>


А>Отсыпте и мне немного


А>PS:

А>Если честно — что значит
А>Action<...> handler;
А>и вот это
А>handler = () =>
А>???
А>Я то догадываюсь как оно работает, но откуда такая запись вообще имеет право на существование?

Три точки означают конкретные параметры метода.
http://files.rsdn.org/67312/MVP_Horizontal_Mini.png
Re[4]: Асинхронные грабли (тривиальные)
От: Аноним  
Дата: 13.07.10 07:52
Оценка:
Здравствуйте, gandjustas, Вы писали:
G>Три точки означают конкретные параметры метода.
А ну тогда остался один вопрос — как это называется вот такая реализация цикла, и где об таком почитать:
handler = () =>
?
Re[5]: Асинхронные грабли (тривиальные)
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 13.07.10 08:19
Оценка:
Здравствуйте, Аноним, Вы писали:

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

G>>Три точки означают конкретные параметры метода.
А>А ну тогда остался один вопрос — как это называется вот такая реализация цикла, и где об таком почитать:
А>handler = () =>
А>?
Это называется лямбда выражение. http://msdn.microsoft.com/ru-ru/library/bb397687.aspx
http://files.rsdn.org/67312/MVP_Horizontal_Mini.png
Re[4]: Асинхронные грабли (тривиальные)
От: Lloyd Россия  
Дата: 13.07.10 08:19
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Три точки означают конкретные параметры метода.


Какие параметры, если он () => ...
Re[5]: Асинхронные грабли (тривиальные)
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 13.07.10 08:20
Оценка:
Здравствуйте, Lloyd, Вы писали:

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


G>>Три точки означают конкретные параметры метода.


L>Какие параметры, если он () => ...

Ну если есть параметры, то надо и в аргументы лямбды подставить.
http://files.rsdn.org/67312/MVP_Horizontal_Mini.png
Re[6]: Асинхронные грабли (тривиальные)
От: Lloyd Россия  
Дата: 13.07.10 08:26
Оценка:
Здравствуйте, gandjustas, Вы писали:

L>>Какие параметры, если он () => ...

G>Ну если есть параметры, то надо и в аргументы лямбды подставить.

Чем-то напоминает сказку про кашу из топора.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.