相关疑难解决方法(0)

在C#中访问变量是一个原子操作吗?

我已经被认为如果多个线程可以访问变量,那么所有对该变量的读取和写入都必须受到同步代码的保护,例如"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字段在锁外读取?另一个线程难道不能同时写入它吗?变量的读写是否是原子的?

c# multithreading

63
推荐指数
4
解决办法
2万
查看次数

如何从后台线程正确更新数据绑定datagridview

我有一个实现INotifyPropertyChanged的自定义对象.我有这些对象的集合,其中集合基于BindingList我已经为集合创建了一个绑定源,并设置了bindingsource和datagridview的数据源.

一切都很好,除了我需要从后台线程更新自定义对象的属性.当我这样做时,我收到以下错误:

BindingSource不能是自己的数据源.不要将DataSource和DataMember属性设置为引用BindingSource的值

我发现以下帖子似乎有我的确切问题(和解决方案?)但我无法弄明白.

http://social.msdn.microsoft.com/forums/en-US/winformsdatacontrols/thread/3566f7c7-eb47-422e-ab09-9549a18da360/

我在业务对象中创建并初始化了每个帖子的oper变量,然后将两个事件函数放入我的集合类中.这个编译正确,但运行时毫无例外地挂起.

我看过许多帖子说使用Invoke/Begin Invoke,但是我没有调用UI上的任何函数,只是更新业务对象,所以我不确定在哪里调用invoke.

一个限制:我希望业务对象不知道谁在显示它(因为有多个消费者)所以将GUI引用发送到业务对象,以便我以后能够使用这些引用调用invoke不是一个选项.

c# data-binding multithreading datagridview inotifypropertychanged

8
推荐指数
1
解决办法
1万
查看次数

必须在与DependencyObject相同的Thread上创建DependencySource

我有一个用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)

c# wpf datagrid multithreading dependency-properties

8
推荐指数
1
解决办法
1万
查看次数