无效的跨线程访问

时间:2014-09-16 14:42:14

标签: c# windows-phone-8

我正在使用此Model类,我使用DataContract反序列化从服务器接收的数据。因此,它有两个字段DataDataColor,其中Data从服务器发送,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)
            ));
    }

现在我甚至没有想到为什么我在尝试创建Invalid cross thread access对象时在Util2.cs中出现此SolidColorBrush错误。我不是想在这里更改任何UI对象。

我想过在这里使用Deployment.Current.Dispatcher.BeginInvoke(),但由于我在这里从函数返回值,所以不能使用Dispatcher。

我需要知道为什么会出现此错误,我该如何解决?

我浪费了很多时间,试图将GetSolidColorFromHexUtil2移到Util1。仍然没有成功。

也没有一些通用方法可以通过传递一些上下文或其他内容来避免Invalid cross thread

由于

1 个答案:

答案 0 :(得分:1)

虽然您没有尝试更改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;
}