无效的跨线程访问
本文关键字:访问 线程 无效 | 更新日期: 2023-09-27 18:22:14
我有这个Model类,我使用DataContract
来反序列化从服务器接收的数据。所以它有这两个字段Data
和DataColor
,其中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)
));
}
现在,当我试图创建SolidColorBrush
对象时,我甚至不知道为什么在Util2.cs中会出现Invalid cross thread access
错误。我不想在这里更改任何UI对象。
我曾想过在这里使用Deployment.Current.Dispatcher.BeginInvoke()
,但由于我从这里的函数返回值,我认为不能使用Dispatcher。
我需要知道为什么我会出现这个错误,以及如何解决这个问题?
我在这方面浪费了很多时间,并试图将GetSolidColorFromHex
从Util2
移动到Util1
。仍然没有成功。
此外,没有一些通用的方法可以通过传递一些上下文或其他内容来避免Invalid cross thread
。
感谢
尽管您没有试图更改UI属性,但SolidColorBrush
只能在UI线程上实例化。
您可以在UI线程上创建笔刷的私有变量,然后返回它。
编辑:
如果不在电脑前确认,我相信这样的东西会起作用:
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;
}