我对执行以下操作有些怀疑:
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已经指向一个方法(“PrintOut”)。为什么我们再次在d.BeginInvoke中传递另一个方法(“回调”)( “你好”,新的 AysncCallback(回调),d);。这是否意味着d.BeginInvoke平行执行“PrintOut”和“Callback”?。请你逐行解释究竟发生了什么?
2)通常,Aysnchronous执行意味着“线程”的执行是不可预测的 还是最快的执行?
3)TestDelegate d = (TestDelegate)ar.AsyncState;
“TestDelegate”d是委托。如何将其投射到归档或财产? (ar.AsyncState
)
4)你能给我一些实例吗?我需要在哪里使用这种异步执行?
答案 0 :(得分:2)
PrintOut
是将在线程池的线程上执行的函数,是您的委托所指向的函数。 Callback
是PrintOut
完成后将执行的函数,您必须在其中调用EndXXX方法,该方法将为您提供PrintOut
执行的结果。这两个函数并行执行 。这是逐行的:
就转换而言:AsyncState
是一个对象,.NET中的委托也是一个对象,因此没有问题。
答案 1 :(得分:2)
1)TestDelegate已经指向一个方法(“PrintOut”)。为什么我们再次在d.BeginInvoke中传递另一个方法(“回调”)(“Hello”,新的AysncCallback(回调),d);.这是否意味着d.BeginInvoke平行执行“PrintOut”和“Callback”?。您能否逐行解释究竟发生了什么?
2)通常,Aysnchronous执行意味着“线程”的执行不可预测或执行速度最快?
3)TestDelegate d =(TestDelegate)ar.AsyncState; “TestDelegate”d是委托。如何将其投射到归档或财产? (ar.AsyncState)
4)你能给我一些实例吗?我需要在哪里使用这种异步执行?
答案 2 :(得分: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();
}
答案 3 :(得分:0)
1)在您的工作(PrintOut)完成后调用回调。您也可以传递一个空值。
2)Aysnchronous执行意味着您的代码运行在除应用程序主线程之外的另一个线程上。
3)ar.AsyncState设置为您在BeginInvoke方法的第3个参数中传递的值。
4)看看这个:http://shiman.wordpress.com/2008/09/10/c-net-delegates-asynchronous-invocation-begininvoke-method/