2012-02-01 3 views
-2

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

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

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

C# 4.0, WPF

+0

Я хотел бы попробовать то же самое с, напр., RichTextBox, является ли это проблемой ListBox –

+0

хорошо позвольте мне попробовать – MonsterMMORPG

+0

я проверил RichTextBox и я не вижу какой-либо способ сделать его на строки. Я имею в виду, что в listbox я редактирую всегда ту же строку, чтобы следить за потоками. Но richtextbox я все равно не вижу. – MonsterMMORPG

ответ

1

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

EDIT:

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

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

// 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

Не могли бы вы предоставить более подробную информацию? – MonsterMMORPG

+0

http://msdn.microsoft.com/en-us/library/ms668604.aspx Наблюдаемая коллекция активирует событие при изменении содержимого. Это означает, что когда вы привязываетесь к списку данных, вам не нужно беспокоиться об обновлении пользовательского интерфейса. Просто обновите эту коллекцию, и привязка данных позаботится обо всем остальном. – SynXsiS

+0

Спасибо за ответ, но он дал ошибку: этот тип CollectionView не поддерживает изменения в SourceCollection из потока, отличного от потока Dispatcher. – MonsterMMORPG

0

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

+0

Пожалуйста, подробнее. Я ничего не понимаю из этого. – MonsterMMORPG

+0

Вот ссылка. http://blogs.msdn.com/b/csharpfaq/archive/2010/06/18/parallel-programming-task-schedulers-and-synchronization-context.aspx – tsells

+0

Это то, что я делаю. Чем отличается эта статья? Я также прочитал это. – MonsterMMORPG

1

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

var status = String.Format("{0} : {1} : processed {2} ...", srMainSiteId, srMainSiteUrl, ...) 
this.Dispatcher.BeginInvoke((Action) delegate() 
    { 
    listBox1.Items[irWhichMainTask] = status; 
    }); 
+0

сейчас этот новый action вещь может повлиять. В чем разница между высказыванием нового действия или действия? – MonsterMMORPG

+0

Mine - это просто актер, чтобы сохранить компилятор счастливым (без штрафных санкций). Yours создает новый объект Action. Кроме того, вы согласуете строки, которые неэффективны. –

+0

Это действительно важно? Я никогда не видел проблем с производительностью из-за временных строк. – MonsterMMORPG