繁体   English   中英

无效的跨线程访问

[英]Invalid cross thread access

我在使用DataContract来反序列化从服务器接收到的数据的Model类中。 因此,它具有两个字段DataDataColor ,其中Data是从服务器发送的,而DataColor是使用某种逻辑DataColor派生的。

ModelClass.cs

    private double _data;
    [DataMember(Name = "data")]
    public double Data
    {
        get { return this._data; }
        set
        {
            SetField(ref _data, value, "Data");
            this.DataColor = Util1.GetColorFromData(value);
        }
    }

    private SolidColorBrush _dataColor;
    public SolidColorBrush DataColor
    {
        get { return this._dataColor; }
        set { SetField(ref _dataColor, value, "DataColor"); }
    }

要设置DataColor我要调用我的Util1类函数之一。

Util1.cs

    public static SolidColorBrush GetColorFromData(double data)
    {
        // apply some logic to get hexColor from data
        return Util2.GetSolidColorFromHex(string hexColor);
    }

依次调用另一个类的Util2函数将hexColor转换为SolidColorBrush

Util2.cs

    GetSolidColorFromHex(string hexColor)
    {
        return new SolidColorBrush(
            Color.FromArgb(
                255,
                Convert.ToByte(hexaColor.Substring(1, 2), 16),
                Convert.ToByte(hexaColor.Substring(3, 2), 16),
                Convert.ToByte(hexaColor.Substring(5, 2), 16)
            ));
    }

现在,我什至没有丝毫想法,当我尝试创建SolidColorBrush对象时,为什么在Util2.cs中收到此Invalid cross thread access错误。 我没有在这里尝试更改任何UI对象。

我考虑过在这里使用Deployment.Current.Dispatcher.BeginInvoke() ,但是由于我要从此处的函数返回值,所以我认为不能使用Dispatcher。

我需要知道为什么会收到此错误,以及如何解决此错误?

我在此上浪费了很多时间,并尝试将GetSolidColorFromHexUtil2移到Util1 仍然没有成功。

也没有通过传递某些上下文或其他某种方式来避免Invalid cross thread的通用方法。

谢谢

尽管您没有尝试更改UI属性,但只能在UI线程上实例化SolidColorBrush

您可以在UI线程上进行创建,以创建画笔的私有变量,然后将其返回。

编辑:

无需在PC上进行确认,我相信这样会起作用:

GetSolidColorFromHex(string hexColor)
{
    SolidColorBrush brush;
    Deployment.Current.Dispatcher.BeginInvoke(
        () => brush = new SolidColorBrush(
            Color.FromArgb(
                255,
                Convert.ToByte(hexaColor.Substring(1, 2), 16),
                Convert.ToByte(hexaColor.Substring(3, 2), 16),
                Convert.ToByte(hexaColor.Substring(5, 2), 16)
        )));

    return brush;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM