Отображение данных нескольких потоков на экране подхода - PullRequest
0 голосов
/ 01 февраля 2012

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

    this.Dispatcher.BeginInvoke(new Action(delegate()
{
    listBox1.Items[irWhichMainTask] = srMainSiteId + " : " + srMainSiteURL + " : processed " + irLocalProcessedLinkCount + " : max thread count " + irLocalThreadCount + " : active thread count " + irActiveThreadCount;
}));

Хорошо, это становится безразличным, даже если через некоторое время запущено 20 потоков.Похоже, использование списка не является хорошим подходом для отображения данных на экране.Что еще я могу использовать?

C # 4.0, WPF

Ответы [ 3 ]

1 голос
/ 01 февраля 2012

Я не уверен, что ListBox вызывает проблемы. Вы создаете много временных строк в потоке пользовательского интерфейса. Лучше всего использовать String.Format (). Также создайте строку в потоке сканирования. Вы также используете новое Действие при каждом вызове.

var status = String.Format("{0} : {1} : processed {2} ...", srMainSiteId, srMainSiteUrl, ...)
this.Dispatcher.BeginInvoke((Action) delegate()
  {
  listBox1.Items[irWhichMainTask] = status;
  });
1 голос
/ 01 февраля 2012

Вы можете попробовать создать наблюдаемую коллекцию для ваших статусов потоков. Затем привяжите список к этой коллекции.

EDIT:

// Define a data context
public class MyContext
{
    public ObservableCollection<string> Values { get; set; }
}

Вы можете сделать следующее в xaml, но мой wpf немного ржавый. Я положил это в форме загрузки.

// Create an instance of your context
var myContext = new MyContext();
myContext.Values = new ObservableCollection<string>();

// Set up a binding between your collection and the 'Items' property of the listbox
Binding b = new Binding();
b.Source = myContext;
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
b.Path = new PropertyPath("Values");
ListBox1.SetBinding(ListBox.ItemsSourceProperty, b);

// Add values to the collection - these will automatically end up in the listbox
myContext.Values.Add("New item");
myContext.Values.Add("Other new item");

// You can change values too
myContext.Values[0] = "This has changed";
0 голосов
/ 01 февраля 2012

Лучшим вариантом будет использовать планировщик задач и заставить его перенаправлять данные обратно в поток пользовательского интерфейса.

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