c# – SynchronizationContext.Post到UI方法

我正在使用Web服务,因此我需要扩展会话长度/重新连接并获取大型数据集等.有时这可能很长,所以我想在一个单独的线程中异步更新UI.

我似乎无法理解使用synchronizationContext在我的UI线程上调用方法.我有它,我已经将我的UIThread上下文传递给我的线程,现在我想更新UI线程上的一些标签等.我已经阅读了很多帖子,但似乎没有解释如何简单地将一些参数传递回方法,或者他们可能会这样做但是我太累了/傻到看到它.

//在主UI线程上

public void updateConnStatus(string conn_name,bool connected)
{
        switch (conn_name)
        {
            case "Conn" : if (connected == true){ //do something} break;

//在单独的线程上

uiContext.Post( //something to do with delegates in here that eludes me );

如果有人可以简单地解释我如何将sendOrPostCallBack链接到原始方法,我将非常感激.

谢谢

编辑:

我设法让代码运行并尝试触发事件,它填充我的自定义eventArgs好,但要么说它没有实例化updateUIConnStatus,需要更多的调查:o

public void updateUIThread(string conn,bool connected)
    {
       uiContext.Post(new SendOrPostCallback((o) => { updateConnStatus(this,new MyEventArgs<String,Boolean>(conn,connected)); }),null);
    }

public class MyEventArgs<T,U> : EventArgs
    {
        private T _val1; private U _val2;
        public  MyEventArgs(T value1,U value2) { _val1 = value1; _val2 = value2; }
        public T val1 { get { return _val1;} }
        public U val2 { get {return _val2;} }
    }

public event EventHandler<MyEventArgs<String,Boolean>> updateConnStatus = Delegate {};

//在UI Thread Now上

public void updateConnStatus(object sender,MyEventArgs<String,Boolean> e)
    {
        switch (e.val1)
        {
            case "Conn1" :
                if (e.val2 == true)
                {

解决方法

您需要SendOrPostCallback类型的委托.这很尴尬,它只需要一个类型为object的参数.你肯定应该看看任务<> .NET 4中提供的类可以使这更容易.或者使用lambda,如下所示:
string conn_name = "foo";
        uiContext.Post(new SendOrPostCallback((o) => {
            updateConnStatus(conn_name,true);
        }),null);

{braces}之间的代码在UI线程上执行.

相关文章

项目中经常遇到CSV文件的读写需求,其中的难点主要是CSV文件...
简介 本文的初衷是希望帮助那些有其它平台视觉算法开发经验的...
这篇文章主要简单记录一下C#项目的dll文件管理方法,以便后期...
在C#中的使用JSON序列化及反序列化时,推荐使用Json.NET——...
事件总线是对发布-订阅模式的一种实现,是一种集中式事件处理...
通用翻译API的HTTPS 地址为https://fanyi-api.baidu.com/api...