您真正需要的只是一个保存数据的类...
class DataContainer
{
readonly byte[] _dataFromWeb;
DataContainer(byte[] data)
{
_dataFromWeb = data;
}
public byte this[int index]
{
get
{
return _dataFromWeb[index];
}
}
public int Length
{
get
{
return _dataFromWeb.GetUpperBound(0)+1;
}
}
}
...和一个线程安全的对象指针,指向存放数据的对象。
class SafePointerContainer
{
static public SafePointerContainer Instance = new SafePointerContainer();
public DataContainer _data = null;
private SafePointerContainer() {}
public DataContainer Data
{
get
{
lock(this)
{
return _data;
}
}
set
{
lock(this)
{
_data = value;
}
}
}
当 UI 线程需要读取数据时,它应该获取指针(以线程安全的方式)并将其放入局部变量中。然后它可以随意使用指针访问所有成员变量。
DataContainer latestData = SafePointerContainer.Instance.Data;
for (int i=0; i<latestData.Length; i++)
{
DisplayData(i, latestData[i]);
}
当工作线程需要更新数据时,它应该实例化一个新的对象实例,然后更新指针(以线程安全的方式)指向新的实例。关键是在设置指针之前更新成员。为了强迫你这样做,我使用 readonly 关键字实现了数据,这意味着它只能在构造函数中设置。
DataContainer newData = new DataContainer(dataJustObtainedFromTheWeb);
SafePointerContainer.Instance.Data = newData;
为上述类赋予有意义的名称,并更改 DataContainer 的内容以适应您从 Web 检索到的任何数据。对于奖励积分,使用泛型重新实现。哒哒。
UI 线程如何知道数据发生了变化?
UI 线程可以像检查任何其他类或变量一样检查 DataContainer。 ANY 线程如何知道任何变量是否已更改?检查它,并将其与最后一个值进行比较。
DataContainer _oldData = null;
while(!UserClickedExit())
{
DataContainer newData = SafePointerContainer.Instance.Data;
if (newData != _oldData)
{
RenderData(newData);
_oldData = newData;
}
else
{
System.Threading.Thread.Sleep(1000);
}
{