C#在一个控制台应用程序中同步来自不同线程的事件我觉得自己是个菜鸟问这个问题,但无论如何,它是:我想知道什么是最简单的同步来自不同线程的事件的方法。一些示例代码:classProgram{staticvoidMain(string[]args){Console.WriteLine("#startedon:"+Thread.CurrentThread.ManagedThreadId);ttt=newtt();t.First+=newEventHandler(t_First);t.Second+=newEventHandler(t_Second);任务task=newTask(newAction(t.Test));任务.开始();while(true){Console.ReadKey();Console.WriteLine("#正在等待:"+Thread.CurrentThread.ManagedThreadId);}}staticvoidt_Second(objectsender,EventArgse){Console.WriteLine("-第二个回调:"+Thread.CurrentThread.ManagedThreadId);}staticvoidt_First(objectsender,EventArgse){Console.WriteLine("-第一个回调:"+Thread.CurrentThread.ManagedThreadId);}classtt{publictt(){}publiceventEventHandler首先;公共事件EventHandler第二;publicvoidTest(){Thread.Sleep(1000);Console.WriteLine("调用时间:"+Thread.CurrentThread.ManagedThreadId);首先(这个,空);线程.睡眠(1000);第二(这个,空);}}}正像你可能猜到的那样,只有第一个writeline在主线程上执行,所有其他调用在任务创建的新线程上执行。我想在主线程上同步调用“第二个”(它永远不应该被调用,因为我在while循环中阻塞)。但是,我想知道这样做的方法,或者是否可能?您可以尝试BlockingCollectionBlockingCollectionactions=newBlockingCollection();voidmain(){//开始你的任务while(true){varaction=actions.Take();行动();}}staticvoidt_First(objectsender,EventArgse){stringmessage="-第一个回调:"+Thread.CurrentThread.ManagedThreadId;actions.Add(_=>Console.WriteLine(message));如果我理解正确,那么你是在问如何将在一个线程上运行的代码执行到另一个线程中。即:你有两个线程,你正在第二个线程中执行代码,你想在第一个线程中执行它。你可以通过使用SynchronizationContext来实现,例如,如果你想从另一个线程执行代码到主线程,你应该使用当前的同步上下文:privatereadonlySystem.Threading.SynchronizationContext_currentContext=System.Threading.SynchronizationContext.Current;私有只读对象_invokeLocker=newobject();publicobjectInvoke(Delegatemethod,object[]args){if(method==null){thrownewArgumentNullException("method");}锁(_invokeLocker){objectobjectToGet=null;SendOrPostCallback调用者=newSendOrPostCallback(delegate(objectdata){objectToGet=method.DynamicInvoke(args);});_currentContext.Send(newSendOrPostCallback(invoker),method.Target);返回对象获取;当你在第二个线程时,使用这个方法会在主线程上执行代码。您可以实施ISynchronizeInvoke“System.ComponentModel.ISynchronizeInvoke”。看看这个例子。编辑:由于您正在运行控制台应用程序,因此您不能使用SynchronizationContext.Current。那么您可能需要设计自己的SynchronizationContext,这个示例可能会有所帮助。以上就是C#学习教程的全部内容:在控制台应用程序中同步不同线程的事件共享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
