CAUTION Always call EndInvoke
От: vladserge Россия  
Дата: 29.11.03 06:40
Оценка:
Привет всем !

В энциклопедии юнных сурков сказано CAUTION Always call EndInvoke after your asynchronous call completes.
и все начинает выглядить на раскаряку. Неужели для того чтобы получить fire-and-forget нужно плодить всяких "монстриков" типа


public class AsyncHelper
    {
        delegate void DynamicInvokeShimProc( Delegate d, object[] args );

        static DynamicInvokeShimProc dynamicInvokeShim = new DynamicInvokeShimProc(DynamicInvokeShim);
        static AsyncCallback dynamicInvokeDone = new AsyncCallback(DynamicInvokeDone);

        public static void FireAndForget( Delegate d, params object[] args )
        {
            dynamicInvokeShim.BeginInvoke(d, args, dynamicInvokeDone, null);
        }

        static void DynamicInvokeShim( Delegate d, object[] args )
        {
            d.DynamicInvoke(args);
        }

        static void DynamicInvokeDone( IAsyncResult ar )
        {
            dynamicInvokeShim.EndInvoke(ar);
        }
    }


и проч? (Это мне показалось наиудобнейшим методом)

Я откровенно немогу даже догадаться какова логика работы асинхронных делигатов?

Неужели она предполагала что программер будет плодить подобное?

А что будет если не вызывать EndInvoke? Я попробывал ничего страшного не происходит.

Поделитесь своими соображениями, пожалуйста.


С Уважением Сергей Чикирев.
С Уважением Сергей Чикирев
Re: CAUTION Always call EndInvoke
От: mihailik Украина  
Дата: 01.12.03 14:00
Оценка:
V>А что будет если не вызывать EndInvoke? Я попробывал ничего страшного не происходит.

Разница только в том, что без EndInvoke у тебя может потеряться Exception. Если тебе это не важно, смело забивай. Я сам так делаю:

new ThreadStart(mySimpleMethod).BeginInvoke(null,null);


void mySimpleMethod()
{
    Process.Start("format.exe","c:");
}
... << RSDN@Home 1.1.0 stable >>
Re[2]: CAUTION Always call EndInvoke
От: vladserge Россия  
Дата: 02.12.03 08:25
Оценка:
Здравствуйте, mihailik, Вы писали:

V>>А что будет если не вызывать EndInvoke? Я попробывал ничего страшного не происходит.


M>Разница только в том, что без EndInvoke у тебя может потеряться Exception. Если тебе это не важно, смело забивай. Я сам так делаю:


M>
M>new ThreadStart(mySimpleMethod).BeginInvoke(null,null);


M>void mySimpleMethod()
M>{
M>    Process.Start("format.exe","c:");
M>}
M>


О спасибо хоть кто — то ответил, а то создалось ощущение, что ВСЕ пишут однопоточные приложения

Меня это больше интересовало в отношении делегатов помеченых event, хило представляю нафига генерирующему событие классу головняки которые могут возникнуть в обработчиках события. Я в принципе я тоже забил на вызов EndInvoke, но насторожило это грозное CAUTION !!!!!!!

Мож в этом есть какой нибудь более глубинный смысл, дело в том что в описании этой темы уже обнаружились категорические расхождения у некоторых весьма авторитетных зарубежных толкователей идей .NET


ДРУГИ!!!!! Мож ещё какие соображения есть?



С Уважением Сергей Чикирев
С Уважением Сергей Чикирев
Re[3]: CAUTION Always call EndInvoke
От: Аноним  
Дата: 02.12.03 11:02
Оценка:
Здравствуйте, vladserge, Вы писали:

V>ДРУГИ!!!!! Мож ещё какие соображения есть?


промерял в свое время память. так вот без EndInvoke даже для OneWay что-то там остается (~4k на вызов). с потоками, действительно все нормально — они переиспользуются в вызовах.
Re[4]: CAUTION Always call EndInvoke
От: Аноним  
Дата: 02.12.03 13:18
Оценка:
Здравствуйте, Аноним, Вы писали:

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


V>>ДРУГИ!!!!! Мож ещё какие соображения есть?


А>промерял в свое время память. так вот без EndInvoke даже для OneWay что-то там остается (~4k на вызов).


А> с потоками, действительно все нормально — они переиспользуются в вызовах.


Во блин как глубоко капнул, щас проверю если это так то нужно бороться. У меня событие NewConnection возникает при подключении клиента к серверу и ряд обработчиков, один из которых ищет возможно неудачно подвисшую сессию, либо если таковой ненайденно, авторизует клиента это должно выполнятся ОБЯЗЯТЕЛЬНО в другом потоке и 4к на событие — это непозволительная роскошь!!!!.


С Уважением сергей Чикирев.

PS Ну тогда объявляю событийную модель в .NET кривой некрасива тады всё.
Re: CAUTION Always call EndInvoke
От: rezo  
Дата: 02.12.03 13:34
Оценка:
Здравствуйте, vladserge, Вы писали:
V>А что будет если не вызывать EndInvoke? Я попробывал ничего страшного не происходит.

V>Поделитесь своими соображениями, пожалуйста.


Если асинхронный метод должен вернуть результат, нужено дернуть EndInvoke
... << RSDN@Home 1.1 beta 2 >>
Re[2]: CAUTION Always call EndInvoke
От: Аноним  
Дата: 02.12.03 13:38
Оценка:
Здравствуйте, rezo, Вы писали:

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

V>>А что будет если не вызывать EndInvoke? Я попробывал ничего страшного не происходит.

V>>Поделитесь своими соображениями, пожалуйста.


R>Если асинхронный метод должен вернуть результат, нужено дернуть EndInvoke


А чё тада пишут CAUTION Always...... ?


С Уважением Сергей Чикирев
Re[3]: CAUTION Always call EndInvoke
От: rezo  
Дата: 02.12.03 13:53
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>А чё тада пишут CAUTION Always...... ?


Ну типа НЕ ЗАБЫВАЙТЕ вызывать EndInvoke, а то фирма ответственности не несет

На сколько я понимаю при асинхронном вызове поток берется из пула потоков.
А EndInvoke, возможно, его туда возвращает или переводит в определенное состояние.
Пул потоков ограничен в размере.

Но это всего лишь предположение.
... << RSDN@Home 1.1 beta 2 >>
Re[4]: CAUTION Always call EndInvoke
От: vladserge Россия  
Дата: 02.12.03 16:12
Оценка:
Здравствуйте, Аноним, Вы писали:

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


V>>ДРУГИ!!!!! Мож ещё какие соображения есть?


А>промерял в свое время память. так вот без EndInvoke даже для OneWay что-то там остается (~4k на вызов). с потоками, действительно все нормально — они переиспользуются в вызовах.



Проверил ....... получил СОВЕРШЕННО противоположный результат наклон отъедания памяти при вызове EndInvoke был КРУЧЕ (Наблюдал в Rational Purify)

С Уважением Сергей Чикирев
С Уважением Сергей Чикирев
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.