线程在属性设置器中

时间:2011-10-27 05:41:43

标签: c# multithreading compact-framework properties invoke

我有两个属性。第一个是整数属性,这是一个ID。第二个是String,它对应于ID。 当我设置ID时,我将在一个单独的线程中设置对应的字符串属性。 代码snipet是:

public int FirstPlaceId 
{
    set 
    {
        firstPlaceId = value;
        setPlaceNameDelegate d = new setPlaceNameDelegate( setPlaceName );
        IAsyncResult iar = d.BeginInvoke( value, null, null );
        FirstPlace = d.EndInvoke( iar );
    }
    get { return firstPlaceId; } 
}

public string FirstPlace { set; get; }

private string setPlaceName(int id) 
{
    return "alma"; 
}

delegate String setPlaceNameDelegate( int id );

methodus() 
{
   FirstPlaceId = 5; 
}

我认为它看起来不错。但是在运行时,当我将一些值(5)分配给FirstPlaceId属性时,会发生NotSupportedException错误。 为什么以及解决方案是什么? THX

2 个答案:

答案 0 :(得分:1)

我无法重现您的问题。您使用的是哪种.NET Framework?

话虽如此,我没有看到在示例代码中使用BeginInvoke / threading的好处,因为它会立即等待委托调用完成(使用EndInvoke)。该属性将阻止并在功能上与此相同:

public int FirstPlaceId
{
    set 
    {
        firstPlaceId = value;
        FirstPlace = setPlaceName(value);
    }
    get { return firstPlaceId; }
}

只需删除BeginInvoke

答案 1 :(得分:0)

public void SetFirstPlaceId(int value)
{
    firstPlaceId = value;
    Thread t = new Thread(delegate()
    {
        FirstPlace = setPlaceName(1);
    });
    t.IsBackground = true;
    t.Start();
}

编辑:修复了实际启动Thread的代码。

通过这个修改它对我来说很好。 (而且我不是C#专家,所以我不确定,但我猜你的delegate由于某些原因不支持BeginInvokeEndInvoke。)