扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:ghost 来源:CSDN 2007年9月24日
关键字:
在本页阅读全文(共2页)
列表A. Calculator类的Add()方法用于将两个数字相加。如果用户直接调用Add()方法,它会在该用户的线程中执行调用,而用户可以通过ISynchronizeInvoke.Invoke()将调用写入正确的线程中。
列表A:
public class Calculator : ISynchronizeInvoke
{
public int Add(int arg1,int arg2)
{
int threadID = Thread.CurrentThread.GetHashCode();
Trace.WriteLine( "Calculator thread ID is " + threadID.ToString());
return arg1 + arg2;
}
//ISynchronizeInvoke implementation
public object Invoke(Delegate method,object[] args)
{
public IAsyncResult BeginInvoke(Delegate method,object[] args)
{
public object EndInvoke(IAsyncResult result)
{
public bool InvokeRequired
{
}
}
//Client-side code
public delegate int AddDelegate(int arg1,int arg2);
int threadID = Thread.CurrentThread.GetHashCode();
Trace.WriteLine("Client thread ID is " + threadID.ToString());
Calculator calc;
/* Some code to initialize calc */
AddDelegate addDelegate = new AddDelegate(calc.Add);
object[] arr = new object[2];
arr[0] = 3;
arr[1] = 4;
int sum = 0;
sum = (int) calc.Invoke(addDelegate,arr);
Debug.Assert(sum ==7);
/* Possible output:
Calculator thread ID is 29
Client thread ID is 30
*/
或许你并不想进行同步调用,因为它被打包发送到另一个线程中去了。你可以通过BeginInvoke()和EndInvoke()方法来实现它。你可以依照通用的.NET非同步编程模式(asynchronous programming model)来使用这些方法:用BeginInvoke()来发送调用,用EndInvoke()来实现等待或用于在完成时进行提示以及收集返回结果。
还值得一提的是ISynchronizeInvoke方法并非安全类型。 类型不符会导致在执行时被抛出异常,而不是编译错误。所以在使用ISynchronizeInvoke时要格外注意,因为编辑器无法检查出执行错误。
实现ISynchronizeInvoke要求你使用一个代理来在后期绑定(late binding)中动态地调用方法。每一种代理类型均提供DynamicInvoke()方法: public object DynamicInvoke(object[] args);
理论上来说,你必须将一个方法代理放到一个需要提供对象运行的真实的线程中去,并使Invoke() 和BeginInvoke()方法中的代理中调用DynamicInvoke()方法。ISynchronizeInvoke的实现是一个非同一般的编程技巧,本文附带的源文件中包含了一个名为Synchronizer的帮助类(helper class)和一个测试程序,这个测试程序是用来论证列表A中的Calculator类是如何用Synchronizer类来实现ISynchronizeInvoke的。Synchronizer是ISynchronizeInvoke的一个普通实现,你可以使用它的派生类或者将其本身作为一个对象来使用,并将ISynchronizeInvoke实现指派给它。
用来实现Synchronizer的一个重要元素是使用一个名为WorkerThread的嵌套类(nested class)。WorkerThread中有一个工作项目(work item)查询。WorkItem类中包含方法代理和参数。Invoke()和BeginInvoke()用来将一个工作项目实例加入到查询里。WorkerThread新建一个.NET worker线程,它负责监测工作项目的查询任务。查询到项目之后,worker会读取它们,然后调用DynamicInvoke()方法。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1733405
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。