当前位置: 首页 > 编程语言 > C#

如何在C#中使用AOP实现不同线程之间的数据共享?分享

时间:2023-04-10 10:54:58 C#

C#中如何使用AOP实现不同线程之间的数据共享?如何在不使用静态变量的情况下在C#中的不同线程之间共享数据?我们可以使用属性创建这样的机制吗?在这种情况下,面向方面的编程有帮助吗?要实现这一点,所有不同的线程都应该在一个对象上工作吗?您可以将对象作为参数传递给Thread.Start,并将其用作当前线程和起始线程之间的共享数据存储。如果您使用ThreadStart委托的实例形式启动线程,您还可以直接访问(当然需要适当的锁定)您的数据成员。您不能使用属性在线程之间创建共享数据。您可以使用附加到类的属性实例作为数据存储,但我不认为它比使用静态或实例数据成员更好。锁定消息队列非常简单。我说不要把时间浪费在更复杂的事情上。阅读锁定声明。LocksEdit下面是一个MicrosoftQueue对象的示例,它经过包装,因此对它的所有操作都是线程安全的。publicclassQueue{///用作锁定目标以确保线程安全。私有只读储物柜_Locker=newLocker();privatereadonlySystem.Collections.Generic.Queue_Queue=newSystem.Collections.Generic.Queue();//publicvoidEnqueue(Titem){lock(_Locker){_Queue.排队(项目);}}///将项目集合排入此队列。publicvirtualvoidEnqueueRange(IEnumerableitems){lock(_Locker){if(items==null){返回;}foreach(项目中的T项目){_Queue。排队(项目);}}}///publicTDequeue(){lock(_Locker){return_Queue.出列();}}///publicvoidClear(){lock(_Locker){_Queue.Clear();}}///publicInt32Count{get{lock(_Locker){return_Queue.Count;}}}///publicBooleanTryDequeue(outTitem){lock(_Locker){if(_Queue.Count>0){item=_Queue.Dequeue();返回真;}else{item=default(T);返回假;}}}}编辑2我希望这个例子有所帮助。记住这是骨头。使用这些基本思想,您可以安全地利用线程的力量。publicclassWorkState{privatereadonlyObject_Lock=newObject();私有Int32_State;publicInt32GetState(){锁(_Lock){返回_State;}}publicvoidUpdateState(){lock(_Lock){_State++;}}}publicclassWorker{privatereadonlyWorkState_State;私有只读线程_Thread;私人易失布尔型_KeepWorking;publicWorker(WorkStatestate){_State=state;_Thread=新线程(DoWork);_KeepWorking=真;}publicvoidDoWork(){while(_KeepWorking){_State.UpdateState();}}publicvoidStartWorking(){_Thread.Start();}publicvoidStopWorking(){_KeepWorking=false;}}privatevoidExecute(){WorkStatestate=newWorkState();工人worker=newWorker(state);worker.StartWorking();while(true){if(state.GetState()>100){worker.StopWorking();休息;}}}查看以下示例代码:publicclassMyWorker{publicSharedDatastate;publicvoidDoWork(SharedDatasomeData){this.state=someData;同时(真);}}公共类SharedData{XmyX;publicgetX(){etcpublicsetX(anX){etc}publicclassProgram{publicstaticvoidMain(){SharedDatadata=newSharedDate()MyWorkerwork1=newMyWorker(data);MyWorkerwork2=newMyWorker(数据);线程thread=newThread(newThreadStart(work1.DoWork));线程。开始();线程thread2=newThread(newThreadStart(work2.DoWork));thread2.Start();在这种情况下,线程类MyWorker具有可变状态,我们使用相同的对象对其进行初始化。现在您可以看到两个工作人员都在访问同一个SharedData对象。一名工作人员所做的更改对另一名工作人员可见。你还有很多问题。工人2如何知道工人1何时进行了更改,反之亦然?您如何防止冲突的更改?也许阅读:本教程。当您启动一个线程时,您正在执行某个选定类的方法。此类的所有属性都是可见的。WorkermyWorker=newWorker(/*参数*/);线程myThread=newThread(newThreadStart(myWorker.doWork));我的线程。开始();您的线程现在位于doWork()方法中,并且可以看到myWorker的Any属性,该属性本身可能是另一个对象。现在您只需要注意多个线程同时访问这些属性的情况。以上就是C#学习教程:如何在C#中使用AOP实现不同线程之间的数据共享?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: