2012-02-01 4 views
-2

나는 석사 학위 논문을위한 자체 크롤러를 만들고 있습니다. 모니터링을 위해 실행하는 동안 여러 스레드 변수를 화면에 표시하려고합니다. 이 방법을 시도했지만 잠시 후 화면이 응답하지 않게됩니다.화면에 여러 스레드 데이터를 표시합니다.

잠시 후 20 개의 스레드가 실행 중일 때 반응이 없습니다. 그래서 listbox를 사용하는 것이 화면에 데이터를 표시하는 좋은 방법이 아닌 것 같습니다. 그 밖의 무엇을 사용할 수 있습니까?

C# 4.0

, WPF

+0

나는 예를 들어,와 같은 일을 시도 할 것입니다.,를 RichTextBox 확실히 제가하여 RichTextBox를 확인하고 내가이 라인을 기반으로 만들기 위해 어떤 방법을 볼 수 없습니다 –

+0

있는지 여부를 확인 할 수 있습니다. 나는 listbox에서 스레드를 따라갈 수 있도록 항상 동일한 라인을 편집 중이다. 그러나 richtextbox 나는 그것을 어떻게해서든지 보지 못한다. – MonsterMMORPG

+0

을 해보자 목록 상자 문제 – MonsterMMORPG

답변

1

당신은 당신의 스레드 상태에 대한 관찰 모음을 만드는 시도 할 수 있습니다. 그런 다음 목록 상자를이 컬렉션에 바인딩합니다.

는 편집 :

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

자세한 정보를 제공해 주시겠습니까? – MonsterMMORPG

+0

http://msdn.microsoft.com/en-us/library/ms668604.aspx 관찰 가능 컬렉션은 내용이 변경되면 이벤트를 발생시킵니다. 즉, 목록 상자에 데이터 바인딩 할 때 UI 업데이트에 대해 걱정할 필요가 없습니다. 이 컬렉션을 업데이트하면 나머지는 데이터 바인딩을 통해 처리됩니다. – SynXsiS

+0

답변 주셔서 감사하지만 오류가 발생했습니다.이 유형의 CollectionView는 Dispatcher 스레드와 다른 스레드에서 SourceCollection에 대한 변경을 지원하지 않습니다. – MonsterMMORPG

0

가장 좋은 방법은 작업 스케줄러를 사용하고 데이터를 UI 스레드로 마샬링하는 것입니다.

+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로 인해 문제가 발생하는지 잘 모르겠습니다. UI 스레드에서 많은 임시 문자열을 생성하고 있습니다. 가장 좋은 방법은 String.Format()을 사용하는 것입니다. 또한 크롤링 스레드에 문자열을 작성하십시오. 모든 전화에 대해 새로운 행동을 취하기도합니다.

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

이제이 새로운 액션이 영향을 미칠 수 있습니다. 새로운 행동이나 행동을 말하는 것의 차이점은 무엇입니까? – MonsterMMORPG

+0

Mine은 컴파일러를 행복하게 유지하기위한 캐스트입니다 (런타임 불이익 없음). 당신이 새로운 Action 객체를 생성하고 있습니다. 또한 문자열의 연결은 실제로 비효율적입니다. –

+0

이 문자열이 중요한 것입니까? 임시 문자열 때문에 성능 문제가 발생하지 않았습니다. – MonsterMMORPG

관련 문제