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

SynchronizationContext.PosttoUI方法分享

时间:2023-04-11 03:33:42 C#

SynchronizationContext.PosttoUIMethod我正在使用网络服务,所以我需要延长会话长度/重新连接并获取大数据集等。有时这可能会很长,所以我希望它在单独的线程中异步更新UI。我似乎无法理解使用synchronizationContext来调用我的UI线程上的方法。我有它,我已经将我的UIThread上下文传递给我的线程,现在我想更新UI线程上的一些标签等。我读了很多帖子,但似乎没有任何内容解释如何简单地将一些参数传递回方法,或者他们可能会这样做,但我太累/太笨了,看不到它。//在主UI线程上publicvoidupdateConnStatus(stringconn_name,boolconnected){switch(conn_name){case"Conn":if(connected==true){//dosomething}break;//在一个单独的线程上uiContext.Post(//这里有一些与代表有关的事情,但我不知道);如果有人能简单地向我解释如何将sendOrPostCallBack链接到原始方法,我将不胜感激。谢谢编辑:我设法让代码运行并尝试触发事件,它填充我的自定义eventArgsok,但要么说它没有实例化updateUIConnStatus,需要更多调查:opublicvoidupdateUIThread(stringconn,boolconnected){uiContext.Post(newSendOrPostCallback((o)=>{updateConnStatus(this,newMyEventArgs(conn,connected));}),null);}publicclassMyEventArgs:EventArgs{privateT_val1;私人U_val2;publicMyEventArgs(Tvalue1,Uvalue2){_val1=value1;_val2=值2;}publicTval1{get{return_val1;}}publicUval2{get{return_val2;}}}publiceventEventHandlerupdateConnStatus=Delegate{};//现在在UI线程上publicvoidupdateConnStatus(objectsender,MyEventArgse){switch(e.val1){case"Conn1":if(e.val2==true){你需要一个SendOrPostCallback类型的委托。这很尴尬,它只接受一个对象类型的参数。您绝对应该看看.NET4中提供的Task类,以简化此过程。或者像这样使用lambda:stringconn_name="foo";uiContext.Post(newSendOrPostCallback((o)=>{updateConnStatus(conn_name,true);}),null);UI中{braces}之间的代码在线程上执行。通常你在UI线程上创建类型(例如ViewModels)的实例,所以你只需将SynchronizationContext或TaskScheduler(首选恕我直言)保存到私有字段并在需要时进行比较......以上是C#学习教程:SynchronizationContext.PosttoUI方法分享所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注—privatereadonlySynchronizationContext_syncContext=SynchronizationContext.Current;私人只读TaskScheduler_scheduler=TaskScheduler.Current;voidOnSomeEvent(objectsender,EventArgse){if(_syncContext!=SynchronizationContext.Current){//如果您需要尽快完成某事,请使用Send。//我们会礼貌地使用Post在队列中等待轮到我们。_syncContext.Post(o=>DoSomething(),null);返回;}//如果我们已经在UI线程上,则直接调用DoSomething();}voidOnSomeOtherEvent(objectsender,MyEventArgse){vararg1=e.Arg1;//“你好”vararg2=e.Arg2;//{“世界”,”!”};//在后台处理参数,然后将结果显示给用户...//注意:我们甚至不需要检查上下文因为我们将//适当的调度程序传递给显示MessageBox的延续。Task.Factory.StartNew(()=>ReturnSomething(arg1,arg2)).ContinueWith(t=>MessageBox.Show(t.Result),_scheduler);}voidDoSomething(){消息框。显示(“你好世界!”);}stringReturnSomething(strings,IEnumerablelist){returns+list.聚合((c,n)=>c+n);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: