我已经被认为如果多个线程可以访问变量,那么所有对该变量的读取和写入都必须受到同步代码的保护,例如"lock"语句,因为处理器可能会在中途切换到另一个线程写.
但是,我正在使用Reflector查看System.Web.Security.Membership并找到如下代码:
public static class Membership
{
private static bool s_Initialized = false;
private static object s_lock = new object();
private static MembershipProvider s_Provider;
public static MembershipProvider Provider
{
get
{
Initialize();
return s_Provider;
}
}
private static void Initialize()
{
if (s_Initialized)
return;
lock(s_lock)
{
if (s_Initialized)
return;
// Perform initialization...
s_Initialized = true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么s_Initialized字段在锁外读取?另一个线程难道不能同时写入它吗?变量的读写是否是原子的?
我有一个实现INotifyPropertyChanged的自定义对象.我有这些对象的集合,其中集合基于BindingList我已经为集合创建了一个绑定源,并设置了bindingsource和datagridview的数据源.
一切都很好,除了我需要从后台线程更新自定义对象的属性.当我这样做时,我收到以下错误:
BindingSource不能是自己的数据源.不要将DataSource和DataMember属性设置为引用BindingSource的值
我发现以下帖子似乎有我的确切问题(和解决方案?)但我无法弄明白.
我在业务对象中创建并初始化了每个帖子的oper变量,然后将两个事件函数放入我的集合类中.这个编译正确,但运行时毫无例外地挂起.
我看过许多帖子说使用Invoke/Begin Invoke,但是我没有调用UI上的任何函数,只是更新业务对象,所以我不确定在哪里调用invoke.
一个限制:我希望业务对象不知道谁在显示它(因为有多个消费者)所以将GUI引用发送到业务对象,以便我以后能够使用这些引用调用invoke不是一个选项.
c# data-binding multithreading datagridview inotifypropertychanged
我有一个用wpf编写的应用程序,它可以下载一些网页,解析HTML代码并保存一些值.
class ListOfItems
{
public List<SomeObject> ListToBind;
public void DownloadItems()
{
Task.Factory.StartNew(() =>
{
...
...
if (OnDownloadCompleted != null)
OnDownloadCompleted(this, EventArgs.Empty);
}
}
}
class SomeObject
{
public string NameOfItem;
public MyClass Properties;
}
class MyClass
{
public int Percentage;
public SolidColorBrush Color;
}
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的对象模型.它是简化版本,我不希望你重新组织它,我有这样写道的原因.在ListOfItems类中是执行所有工作的方法(内部使用一些其他方法使代码可读) - 下载源,解析和填充ListToBind数据,fe
[0] => NameOfItem = "FirstOne", Properties = {99, #FF00FF00}
[1] => NameOfItem = "SecondOne", Properties = {50, #FFFF0000}
etc.
Run Code Online (Sandbox Code Playgroud)
如您所见,当此方法DownloadItems完成其作业时,OnDownloadCompleted将引发事件.在主线程中是以下代码
void listOfItems_OnDownloadCompleted(object sender, EventArgs …Run Code Online (Sandbox Code Playgroud)