вопрос про асинхнонность с BrainBench
От: Аноним  
Дата: 03.12.06 17:34
Оценка:
public delegate void ActionStart(object someAction); 
public void ActionCallback(IAsyncResult iar) {} 

public void DoAction(object action) { 
 // do some long action 
} 

public void DoActionAsync(object action) { 
 ActionStart myAction = new ActionStart(DoAction); 
 AsyncCallback myCallback = new AsyncCallback(ActionCallback); 
 // "call do action" 
 (CODE HERE) 
}


What lines of code, at the location (CODE HERE) above, call DoAction asynchronously and then block until it was finished?

Choice 1   
 IAsyncResult iar = myAction.BeginInvoke(action, myCallback, null);
myAction.EndInvoke(iar);  
Choice 2   
 myAction.BeginInvoke(action, null, null);
myAction.WaitOne();  
Choice 3   
 myAction.BeginInvoke(action, null, null);
myAction.EndInvoke();  
Choice 4   
 myAction.BeginInvoke();  
Choice 5   
 IAsyncResult iar = myAction.BeginInvoke(action, null, null);
myAction.EndInvoke(iar);


задаю вопрос потому что меня этот вопрос загнал в тупик
по-моему 1 и 5 вариант ничем не отличаются...
точнее отличаются но обы выполнят условия поставленной задачи
Re: вопрос про асинхнонность с BrainBench
От: KonstantinBart Россия  
Дата: 04.12.06 23:45
Оценка:
Здравствуйте, <Аноним>, Вы писали:


А>
А>public delegate void ActionStart(object someAction); 
А>public void ActionCallback(IAsyncResult iar) {} 

А>public void DoAction(object action) { 
А> // do some long action 
А>} 

А>public void DoActionAsync(object action) { 
А> ActionStart myAction = new ActionStart(DoAction); 
А> AsyncCallback myCallback = new AsyncCallback(ActionCallback); 
А> // "call do action" 
А> (CODE HERE) 
А>}
А>


А> What lines of code, at the location (CODE HERE) above, call DoAction asynchronously and then block until it was finished?


А>
А>Choice 1   
А> IAsyncResult iar = myAction.BeginInvoke(action, myCallback, null);
А>myAction.EndInvoke(iar);  
А>Choice 2   
А> myAction.BeginInvoke(action, null, null);
А>myAction.WaitOne();  
А>Choice 3   
А> myAction.BeginInvoke(action, null, null);
А>myAction.EndInvoke();  
А>Choice 4   
А> myAction.BeginInvoke();  
А>Choice 5   
А> IAsyncResult iar = myAction.BeginInvoke(action, null, null);
А>myAction.EndInvoke(iar); 
А>


А>задаю вопрос потому что меня этот вопрос загнал в тупик

А>по-моему 1 и 5 вариант ничем не отличаются...
А>точнее отличаются но обы выполнят условия поставленной задачи

Доброго времени суток!
А по-моему очень даже отличается.
Если убрать myCallback из BeginInvoke — то функция ActionCallback никогда не вызовется!
А с первым вариантом отработает сначала DoAction, а затем отработает ActionCallback.
... << RSDN@Home 1.2.0 alpha rev. 668>>
Re[2]: вопрос про асинхнонность с BrainBench
От: ie Россия http://ziez.blogspot.com/
Дата: 05.12.06 04:20
Оценка:
Здравствуйте, KonstantinBart, Вы писали:

А>>задаю вопрос потому что меня этот вопрос загнал в тупик

А>>по-моему 1 и 5 вариант ничем не отличаются...
А>>точнее отличаются но обы выполнят условия поставленной задачи

KB>А по-моему очень даже отличается.


О чем спор, ребята?

KB>Если убрать myCallback из BeginInvoke — то функция ActionCallback никогда не вызовется!

KB>А с первым вариантом отработает сначала DoAction, а затем отработает ActionCallback.

Но тем не менее, к вопросу это отношение не имеет.

Что до BrianBench, то у них на самом деле навалом вопросов с неоднозначным ответом. К тому же, прослеживается, что при составлении вопросов по C#, они руководствовались не здравым смыслом или спецификацией языка, а MSDN. Читаем:

Asynchronous delegates allow you to call a synchronous method in an asynchronous manner. When you call a delegate synchronously, the Invoke method calls the target method directly on the current thread. If the compiler supports asynchronous delegates, it will generate the Invoke method and the BeginInvoke and EndInvoke methods. If the BeginInvoke method is called, the common language runtime (CLR) will queue the request and return immediately to the caller. The target method will be called on a thread from the thread pool. The original thread, which submitted the request, is free to continue executing in parallel with the target method, which is running on a thread pool thread. If a callback method has been specified in the call to the BeginInvoke method, the callback method is called when the target method returns. In the callback method, the EndInvoke method obtains the return value and any in/out parameters. If no callback method is specified when calling BeginInvoke, EndInvoke can be called from the thread that called BeginInvoke.

Т.е. если задали callback, то должны вызывать EndInvoke в нем, а если не задали, то можно и в текущем потоке. Вообще говоря это бред. Никаких условий на место вызова EndInvoke от присутствия callback не накладывается. Надо лишь помнить, что вызывать его можно лишь единожды для каждой асинхронной операции. В вопросе EndInvoke в ActionCallback не вызывается, т.е. никаких проблем не возникает.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.