'EndInvoke'에 해당되는 글 1건

  1. 2013.09.06 메소드 비동기호출

메소드 비동기호출

IT/C# 2013. 9. 6. 17:14
using System;
using System.Threading;
using System.Runtime.Remoting.Messaging;

namespace AsyncCallbackTest
{
      public delegate String FixByItselfDelegate(String part); 

      class Program
      {
            public static void Main(String[] args)
            {
                  Car myCar  = new Car();
                  FixByItselfDelegate d = new FixByItselfDelegate(myCar.FixByItself);
                  AsyncCallback oCallback = new AsyncCallback(myCar.FixCompleted); 
 
                  d.BeginInvoke("Engine", oCallback, null);
                  Console.WriteLine("Method is called asyncronously in {0}", Thread.CurrentThread.GetHashCode());
                  Thread.Sleep(5000); // Thread will wait for 5 seconds.
                  Console.WriteLine(Thread.CurrentThread.GetHashCode() + " Thread is ended. Press enter,please.");
                  Console.ReadLine();
             }
      }
      
      public class Car
      {
            public String Name;
            public String ProductYear;
            public String FixByItself(String part)
            {
                  Console.WriteLine("Now Fixing {0} in Thread {1}", part, Thread.CurrentThread.GetHashCode());
                  Thread.Sleep(3000); // Thread will wait for 3 seconds.
                  return "Fixing " + part + " is completed";
            }
            
            public void FixCompleted(IAsyncResult ar)
            {
                  AsyncResult AR = (AsyncResult)ar; 
                  FixByItselfDelegate d = (FixByItselfDelegate)AR.AsyncDelegate; // ar을 FixByItselfDelegate로 변환 후 
                     String strResult = d.EndInvoke(ar); // EndInvoke로 return 값을 읽어온다.
                  Console.WriteLine(strResult);
            }
      }
}

 

C#에서 비동기적으로 메소드를 호출하는 방법이다.

리턴값이 필요한 경우에는 델리게이트명.BeginInvoke를 호출할 때 두번째 인수로 AsyncCallback 개체를 넘겨주면 된다. 이 메소드 안에서 IAsyncResult 객체를 비동기적으로 호출한 메소드에 대한 델리게이트로 변환한 후 EndInvoke를 호출하면 Return 값을 얻어올 수 있다.

Posted by lI헐헐Il
,