2008-09-18 17 views
2

다중 스레드 텍스트 가져 오기 기능 (일반적으로 SQL Server 2005에 CSV)을 작성하려고하는데 VB.NET에서이 작업을 수행하려고하지만 C# . VS 2008 평가판을 가지고 있으며 어디서부터 시작해야할지 모릅니다. 누구든지 내가 볼 수있는 방향으로 나를 가리킬 수 VERY VS 2008 간단한 멀티 스레드 응용 프로그램의 소스?VB.Net (또는 C#) 2008 다중 스레드 가져 오기

감사합니다.

답변

2

참조 된 DevX 문서는 2001 년부터이며, 닷넷 프레임 워크 1.1,하지만 오늘은 닷넷 프레임 워크 2.0 BackgroundWorker 클래스를 제공합니다. 응용 프로그램에 포 그라운드 UI 구성 요소가 포함되어있는 경우 권장되는 스레딩 클래스입니다. MSDN Threads and Threading에서

:

사용자 인터페이스와 상호 작용 을 배경 스레드를 실행해야하는 경우, .NET Framework 버전 2.0 는 상호로, 이벤트를 사용하여 통신하는 BackgroundWorker 구성 요소 을 제공합니다 스레드 마샬링을 사용자 인터페이스 스레드 에 적용합니다.

이 예제에서는 MSDN BackgroundWorker Class의 백그라운드 작업, 진행률 % 및 취소 옵션이 표시됩니다. (예는 이상 DevX 샘플보다,하지만 훨씬 더 많은 기능이 있습니다.) 내가 찾은 최고의 스레딩 문서에 대한

Imports System.ComponentModel 

Partial Public Class Page 
    Inherits UserControl 
    Private bw As BackgroundWorker = New BackgroundWorker 

    Public Sub New() 
     InitializeComponent() 

     bw.WorkerReportsProgress = True 
     bw.WorkerSupportsCancellation = True 
     AddHandler bw.DoWork, AddressOf bw_DoWork 
     AddHandler bw.ProgressChanged, AddressOf bw_ProgressChanged 
     AddHandler bw.RunWorkerCompleted, AddressOf bw_RunWorkerCompleted 

    End Sub 
    Private Sub buttonStart_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) 
     If Not bw.IsBusy = True Then 
      bw.RunWorkerAsync() 
     End If 
    End Sub 
    Private Sub buttonCancel_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) 
     If bw.WorkerSupportsCancellation = True Then 
      bw.CancelAsync() 
     End If 
    End Sub 
    Private Sub bw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) 
     Dim worker As BackgroundWorker = CType(sender, BackgroundWorker) 

     For i = 1 To 10 
      If bw.CancellationPending = True Then 
       e.Cancel = True 
       Exit For 
      Else 
       ' Perform a time consuming operation and report progress. 
       System.Threading.Thread.Sleep(500) 
       bw.ReportProgress(i * 10) 
      End If 
     Next 
    End Sub 
    Private Sub bw_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) 
     If e.Cancelled = True Then 
      Me.tbProgress.Text = "Canceled!" 
     ElseIf e.Error IsNot Nothing Then 
      Me.tbProgress.Text = "Error: " & e.Error.Message 
     Else 
      Me.tbProgress.Text = "Done!" 
     End If 
    End Sub 
    Private Sub bw_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs) 
     Me.tbProgress.Text = e.ProgressPercentage.ToString() & "%" 
    End Sub 
End Class 
+0

을 두드리는 두 개 이상의 아주 좋은 공짜 스레딩 라이브러리가있다 .NET 프로젝트. 멀티 스레딩 요구가 매우 간단하면 이길 수 없습니다. –

+0

업데이트 해 주셔서 감사합니다 !! – Taptronic

4

이것은 훌륭한 기사입니다 : 특히

http://www.devx.com/DevX/10MinuteSolution/20365

:

Dim t As Thread 
t = New Thread(AddressOf Me.BackgroundProcess) 
t.Start() 

Private Sub BackgroundProcess() 
    Dim i As Integer = 1 
    Do While True 
     ListBox1.Items.Add("Iterations: " + i) 
     i += 1 
     Thread.CurrentThread.Sleep(2000) 
    Loop 
End Sub 
1

http://www.albahari.com/threading/

내가 수도의 경우는, 간단한 예제와 문제가 있었다 그것들은 종종 너무 단순하다는 것입니다. 일단 카운트 또는 백그라운드 데모 정렬을 지나면 일반적으로 UI 등을 업데이트해야하며 몇 가지 문제가 있습니다. 비슷하게 간단한 예제에서는 리소스 경합을 다루지 않아도되고 리소스를 사용할 수 없을 때 (예 : Db 연결) 생각할 때 쓰레드가 정상적으로 저하되지 않아도됩니다.

개념적으로 스레드를 통해 작업을 배포하는 방법과 원하는 수를 결정해야합니다. 스레드 관리와 관련된 오버 헤드가 있고 일부 메커니즘에서는 리소스 경합 자체에 영향을받을 수있는 공유 스레드 풀을 사용합니다 (예 : 빈 폼을 표시하는 프로그램을 실행할 때마다 작업 관리자에서 볼 수있는 스레드 수).

실제 업로드를 수행하는 스레드는 완료 한 경우, 실패한 경우 (실패한 경우) 등의 신호를 보내야합니다. 컨트롤러는이를 처리하고 시작/중지 프로세스 등을 관리 할 수 ​​있어야합니다.

마지막으로 (거의), 멀티 쓰레드를 만드는 것이 성능을 향상 시킨다는 것이 항상 사실이라고 가정하지는 않습니다. 예를 들어, 파일을 세그먼트로 잘라내지만 저속 링크 (ADSL)를 통과해야만하는 경우 외부의 힘에 의해 제약을받으며 스레딩 트릭이 발생하지 않습니다.데이터베이스 업데이트, 웹 요청, 많은 양의 디스크 입출력 등을 적용 할 수 있습니다.

이 모든 것에도 불구하고, 나는 운명의 선지자가 아닙니다. 여기에있는 참조는 원하는 것을 성취하는 데 도움이되는 것 이상이지만 스레딩이 복잡해 보이는 이유 중 하나는 다음과 같습니다.

BackgroundWorker/Threadpool보다 제어하기를 원하지만 모든 일을 할 자신 장소 주위 I 성공적으로 VB 몇에서 BackgroundWorker 구성 요소를 사용했습니다 (인 Wintellect & PowerThreading)

건배

사이먼

+0

그 대답 Simon을 보내 주셔서 감사합니다. 그 * 우수한 기사/리소스입니다! – Taptronic