Потоки в установщике свойств - PullRequest
0 голосов
/ 27 октября 2011

У меня есть два свойства.Первый - целочисленное свойство, это идентификатор.Второй - String, соответствует идентификатору.Когда я устанавливаю идентификатор, я устанавливаю соответствующее свойство строки в отдельном потоке.Фрагмент кода:

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 ]

1 голос
/ 27 октября 2011

Я не могу воспроизвести вашу проблему.Какой .NET Framework вы используете?

С учетом вышесказанного я не вижу преимущества использования BeginInvoke / threading в вашем примере кода, поскольку он будет сразу же ждать завершения вызова делегата (с EndInvoke).Это свойство просто заблокирует и функционально будет таким же:

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

Просто удалите BeginInvoke.

0 голосов
/ 27 октября 2011
public void SetFirstPlaceId(int value)
{
    firstPlaceId = value;
    Thread t = new Thread(delegate()
    {
        FirstPlace = setPlaceName(1);
    });
    t.IsBackground = true;
    t.Start();
}

РЕДАКТИРОВАТЬ: исправлен код для фактического запуска Thread.

С этой модификацией он просто отлично работает для меня.(И я не эксперт по C #, поэтому не знаю наверняка, но я думаю, что ваш delegate по какой-то причине не поддерживает BeginInvoke и EndInvoke.)

...