2009-11-23 4 views
1

У меня есть некоторые сомнения в выполнении следующих действий:C# /ASP.NET асинхронное выполнение резьбы

public class Test 
{ 
    delegate int TestDelegate(string parameter); 

    static void Main() 
    { 
     TestDelegate d = new TestDelegate(PrintOut); 

     d.BeginInvoke("Hello", new AsyncCallback(Callback), d); 

     // Give the callback time to execute - otherwise the app 
     // may terminate before it is called 
     Thread.Sleep(1000); 
     Console.ReadKey(true); 
    } 

    static int PrintOut(string parameter) 
    { 
     Console.WriteLine(parameter); 
     return 5; 
    } 

    static void Callback(IAsyncResult ar) 
    { 
     TestDelegate d = (TestDelegate)ar.AsyncState; 
     Console.WriteLine("Delegate returned {0}", d.EndInvoke(ar)); 
    } 
} 

1) TestDelegate уже указывает на метод («распечатке») .Why делать снова мы проходим другой метод («callback») в d.BeginInvoke («Привет», новый AysncCallback (Callback), d) ;. Означает ли это, что d.BeginInvoke выполняет «PrintOut» и «Обратный звонок» параллельно? объясните по строкам, что именно происходит?

2) Обычно Aysnchronous выполнение означает, что выполнение «потока» не предсказуемо или самое быстрое исполнение?

3) TestDelegate d = (TestDelegate)ar.AsyncState; «TestDelegate» d является делегатом. Как его можно отнести к поданной или собственности? (ar.AsyncState)

4) Можете ли вы предоставить мне какой-нибудь живой пример, где мне нужно использовать это асинхронное выполнение?

ответ

2

1) TestDelegate уже указывает на метод ("распечатке") Почему снова мы проходим еще один метод ("обратный вызов") в d.BeginInvoke ("Hello. », новый AysncCallback (обратный вызов), d) ;. Означает ли это, что d.BeginInvoke выполняет« PrintOut »и« Обратный звонок »параллельно? Возможно, объясните, что именно происходит?

  • PrintOut и Callback не выполняются в парализованном порядке.Обратный вызов будет вызван, когда PrintOut закончит и вернется.

2) Обычно Aysnchronous выполнение означает, что выполнение «потока» не является предсказуемым или самым быстрым выполнением?

  • No. Асинхронное исполнение означает, что выполнение не является синхронным. То есть .. время и время выполнения выполнения не связаны с синхронизацией фрагмента кода, который запускает асинхронную операцию. Это противоположность синхронному исполнению. При синхронной работе вы ожидаете завершения выполнения перед выполнением следующего оператора. Например, вызов другого метода напрямую - это синхронная операция, или другой пример вызывает функцию на удаленной службе и ожидает ее возврата до продолжения.

3) TestDelegate d = (TestDelegate) ar.AsyncState; «TestDelegate» d является делегатом. Как его можно отнести к поданной или собственности? (ar.AsyncState)

  • Делегат не относится к полю или собственности. Отливка - это наоборот. Поле или свойство передается в TestDelegate.

4) Можете ли вы предоставить мне какой-нибудь живой пример, где мне нужно использовать это асинхронное выполнение?

  • Примером может служить пользовательский интерфейс, отображающий отчеты. Возможно, отчет должен быть создан из данных в базе данных и требуется много времени для генерации. Вы хотели бы генерировать отчет асинхронно, чтобы пользовательский интерфейс мог продолжать работать. Если отчет не генерируется асинхронно, пользовательский интерфейс может быть заморожен, и пользователь может подумать, что программа потерпела крах.
2

PrintOut - это функция, которая будет выполняться в потоке из пула потоков и является функцией, на которую указывает ваш делегат. Callback - это функция, которая будет выполнена после завершения PrintOut и в которой вы должны вызвать метод EndXXX, который даст вам результат выполнения PrintOut. Эти две функции: не выполнены параллельно. Вот построчно:

  1. Создать делегат, указывающий на метод распечатке
  2. Нарисуйте поток из пула потоков (если таковые имеются) и запустить метод PrintOut на эту тему, передавая «Hello» в качестве аргумента.
  3. Тем временем основная нить спит в течение 1 секунды
  4. После завершения процесса PrintOut вызывается метод обратного вызова. Здесь вы обрабатываете результат асинхронной операции.

Что касается литья: AsyncState - это объект, делегат в .NET также является объектом, поэтому нет проблем с литьем.

0

1) Обратный вызов вызывается после завершения работы (PrintOut). Вы также можете передать нулевое значение.

2) Асинхронное выполнение означает, что ваш код работает в другом потоке, чем основной поток приложения.

3) ar.AsyncState устанавливается в значение, которое вы передали в третьем параметре метода BeginInvoke.

4) Проверьте это: http://shiman.wordpress.com/2008/09/10/c-net-delegates-asynchronous-invocation-begininvoke-method/

1

1) Callback будет вызываться по времени выполнения после выполнения PrintOut.

2) Да, это не предсказуемо. BeginInvoke делает код для выполнения в потоке из пула, поэтому реальная производительность зависит от многих параметров, таких как использование потоков в других местах вашей программы.

3) Делегаты - это объекты. Таким образом, ссылка на них может быть отброшена на объект и назад. В случае IAsyncResult возвращено BeginInvoke, AsyncState Депозитарий магазинов, чтобы обеспечить правильное извлечение результата.

4) Фрагмент из программы открытия турникета и делая индикацию (оба времени) после аутентификации пользователя:

if(user.Id.HasValue) 
{ 
    Action openDoor = turnstile.Open; 
    Action<LedColor> indicate = led.SetColor; 
    // starting async operations 
    openDoor.BeginInvoke(openDoor.EndInvoke, null); 
    indicate.BeginInvoke(LedColor.Green, indicate.EndInvoke, null); 
    // main thread activity. 
    MakeRecordToLog(); 
} 
Смежные вопросы