我正在使用BackgroundWorker
,但是我使用的方式与以往不同。
通常,我使用BW来更新一些图形控件,并在DoWork
方法中执行所有必需的任务,返回结果并对RunWorkerCompleted
事件处理程序执行赋值操作。
这里,我只想将某些计算(DB查询)的结果分配给当前窗口的某个私有变量_myList
。
我非常惊讶地发现,我可以从DoWork
方法中分配列表,并且我真的很惊讶。
我只是想知道这是否正常,或者出于某种原因不建议这样做?
我正在使用BackgroundWorker
,但是我使用的方式与以往不同。
通常,我使用BW来更新一些图形控件,并在DoWork
方法中执行所有必需的任务,返回结果并对RunWorkerCompleted
事件处理程序执行赋值操作。
这里,我只想将某些计算(DB查询)的结果分配给当前窗口的某个私有变量_myList
。
我非常惊讶地发现,我可以从DoWork
方法中分配列表,并且我真的很惊讶。
我只是想知道这是否正常,或者出于某种原因不建议这样做?
由于变量没有任何防止跨线程操作的检查,因此您将被允许对其进行分配,唯一执行这些检查的是UI元素。
至于是否建议这样做,您正在涉足多线程同步领域。
通常,在尝试使用资源之前锁定对其的访问,以防止诸如竞态条件之类的问题:
static object Locker = new object();
lock (Locker)
{
// variable assignment in here.
}
这是完全正常和可以的。您只是不允许从创建它们的不同线程访问控件。对于所有其他变量,没有这样的限制。
但是,您需要小心与线程相关的其他问题:如果有两个线程访问同一个变量,如果访问未同步,可能会遇到问题。
如果您认为在此过程发生时用户仍然能够使用UI是合理的,那么“离线”同步数据并没有任何问题。
我经常这样做,特别是在开发移动应用程序时。