2014-02-27 56 views
1

我想要做的是排队一个类似的任务大列表。每项任务完成的时间很短,但其中有很多。对于列表中的每个项目,我创建一个委托并调用delegate.BeginInvoke方法,然后移动到创建下一个项目。为什么回调/ endinvoke在所有调用被调用后都会发生?

我希望在下面的例子中,我会得到至少一个“* ** * **末尾调用* ***”发生所有的开始调用被调用。相反,它看起来好像编译器在收到任何结束调用之前就开始了所有的开始调用。

这是正常的行为吗?是否有另一种方法可以在另一个线程上发送任务/方法,并在继续激发更多任务的同时接收它?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Threading; 

namespace AsyncResultTesting 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      Console.WriteLine("Starting"); 
      for (int i = 0; i < 100; i++) 
      { 
       delMeth d = new delMeth(sleepMethod); 
       Console.WriteLine(string.Format("Calling the begin invoke from thread: {0} for ID: {1}", Thread.CurrentThread.ManagedThreadId.ToString(), i.ToString())); 
       IAsyncResult ar = d.BeginInvoke(i, callbackMessage, d); 
      } 
      Console.ReadLine(); 
     } 

     private delegate int delMeth(int id); 

     private static int sleepMethod(int id) 
     { 
      Console.WriteLine(Environment.NewLine + String.Format("Thread: {0} is sleeping. Delegate id is {1}", Thread.CurrentThread.ManagedThreadId.ToString(),id.ToString())); 
      Console.WriteLine(String.Format("Thread Properties IsThreadPoolThread? = {0} isThreadBackground? = {1} ThreadState: = {2}", Thread.CurrentThread.IsThreadPoolThread.ToString(), Thread.CurrentThread.IsBackground.ToString(), Thread.CurrentThread.ThreadState.ToString())); 
      Console.WriteLine(""); 
      Thread.Sleep(100);    
      return id; 

     } 

     private static void callbackMessage(IAsyncResult ar) 
     { 
      delMeth d = (delMeth)ar.AsyncState; 
      int result = d.EndInvoke(ar); 
      Console.WriteLine(Environment.NewLine + "************************ END INVOKE *****************************"); 
      Console.WriteLine(String.Format("Delegate was just called back for id: {0}", result.ToString())); 
     } 

    } 


} 

不幸的是,我不得不使用.NET 3.5来设计它,所以我不能使用任何异步处理。

+4

你在睡觉100ms。这可能比开始执行100个任务的时间要长得多。这里意外的是什么? – usr

回答

1

USR是正确的。一切都在运作,我期望它。如果我睡了10毫秒,然后我看到EndInvokes在BeginInvokes中间回来。

谢谢USR。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Threading; 

namespace AsyncResultTesting 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      Console.WriteLine("Starting"); 



      for (int i = 0; i < 150; i++)   { 
       delMeth d = new delMeth(sleepMethod); 
       Console.WriteLine(string.Format("Calling the begin invoke from thread: {0} for ID: {1}", Thread.CurrentThread.ManagedThreadId.ToString(), i.ToString())); 
       IAsyncResult ar = d.BeginInvoke(i, new AsyncCallback(callbackMessage), d); 
      } 
      Console.ReadLine(); 
     } 

     private delegate int delMeth(int id); 

     private static int sleepMethod(int id) 
     { 
      Console.WriteLine(Environment.NewLine + String.Format("Thread: {0} is sleeping. Delegate id is {1}", Thread.CurrentThread.ManagedThreadId.ToString(),id.ToString())); 
      Console.WriteLine(String.Format("Thread Properties IsThreadPoolThread? = {0} isThreadBackground? = {1} ThreadState: = {2}", Thread.CurrentThread.IsThreadPoolThread.ToString(), Thread.CurrentThread.IsBackground.ToString(), Thread.CurrentThread.ThreadState.ToString())); 
      Console.WriteLine(""); 
      Thread.Sleep(10);    
      return id; 

     } 

     private static void callbackMessage(IAsyncResult ar) 
     { 
      delMeth d = (delMeth)ar.AsyncState; 
      int result = d.EndInvoke(ar); 
      Console.WriteLine(Environment.NewLine + "************************ END INVOKE *****************************"); 
      Console.WriteLine(String.Format("Delegate was just called back for id: {0}", result.ToString())); 
     } 

    } 


} 
相关问题