微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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线程上执行.

原文地址:https://www.jb51.cc/csharp/98083.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐