WPF DataGrd не обновляется должным образом из-за другого потока - PullRequest
0 голосов
/ 21 февраля 2011

Я разрабатываю приложение WPF, которое привязывается к DataGrid, как указано ниже:

<DataGrid AutoGenerateColumns="True"
          ItemsSource="{Binding Source={StaticResource tradeViewModel},
                                Path=Result}"

Где Path, указывающий на свойство Result в модели представления, которое inturn вызывает TradePriceChanger.GetTrades()

Метод TradePriceChanger.GetTrades возвращает sList of Trade, как указано ниже:

public static class TradePriceChanger
{
    static List<Trade> tradeList = new List<Trade>();
    static int TradeCounter = 1;
    static ManualResetEvent manualReset = new ManualResetEvent(false);

    public static IEnumerable<Trade> GetTrades()
    {
        Thread t1 = new Thread(new ThreadStart(One));
        t1.Start();

        Thread t2 = new Thread(new ThreadStart(Two));
        t2.Start();

        manualReset.WaitOne();

        return tradeList;
    }


    public static void One()
    {
        for (int i = 1; i < 10; i++)
        {
            tradeList.Add(new Trade ( "One" + i,  i ));
        }
        Interlocked.Decrement(ref TradeCounter);
        if (TradeCounter == 0)
            manualReset.Set();
    }

    public static void Two()
    {
        for (int i = 1; i < 10; i++)
        {
            tradeList.Add(new Trade("Two" + i, i));
        }
        Interlocked.Decrement(ref TradeCounter);
        if (TradeCounter == 0)
            manualReset.Set();
    }
}

А класс Trade имеет таймер, который обновляет свою цену до случайного значения через каждые 1 с.

public class Trade:INotifyPropertyChanged
{
    private string _name;
    private double _price;

    public Trade(string name, double price)
    {
        _name = name;
        _price = price;

        TimerCallback callback = new TimerCallback(ChangePrice);
        Timer timer = new Timer(callback, this, 0, 1000);
    }

    private static void ChangePrice(object obj)
    {
        if (obj is Trade)
        {
            Trade trade = obj as Trade;
            trade.Price = trade.Price + ( new Random().Next(-1,2) * (new Random().NextDouble()));
        }
    }

    public string Name { get { return _name; } set { _name = value; } }
    public double Price
    {
        get
        {
            return _price;
        }
        set
        {
            _price = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("Price"));
            }
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

Теперь проблема в том, что значения в сетке обновляются правильно. Когда я запускаю только поток t1 в TradePriceChanger.GetTrades ().Но, если я запускаю оба, обновления в пользовательском интерфейсе не происходит.

Я что-то здесь упускаю.

Пожалуйста, дайте мне знать.

Спасибо, Махеш

1 Ответ

0 голосов
/ 21 февраля 2011

Кажется, вы ожидаете только один поток, используя 'manualReset.WaitOne();', но если вы хотите, чтобы оба потока имели время для выполнения, вы должны использовать WaitAll(); В противном случае один поток может завершиться, и функция завершит работу.поскольку ожидание было бы удовлетворено.

Также кажется, что вы добавляете в свой торговый список без какой-либо синхронизации потоков, поэтому оба потока могут писать в этот список и вызывать несогласованное состояние в вашем списке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...