2016-03-31 17 views
0

Tuhaf bir sorun yaşıyorum.Birden Fazla İş Parçacığı Bir işlev çalıştıran VB.net

Kontrol Listemde 3 tane ürün var. Tüm eşyaları kontrol edip düğmem üzerine tıklıyorum. Düğme eşit sayıda iş parçacığı oluşturmalı (işaretli öğe sayısı kadar) ve işaretli öğelerin dizinini bir işleve vermelidir. İşlev kontrol edilenleri konsolda verir.

Public Class Form1 
    Private ThreadList As New List(Of Threading.Thread) 

    Private Sub MeineFunktion(ByVal username As String) 
     Threading.Thread.Sleep(2000) 
     Console.WriteLine(username) 
     'Debug.Print(username) 
    End Sub 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Dim indexChecked As Integer 


     For Each indexChecked In CheckedListBox1.CheckedIndices 



      Dim t As Threading.Thread = New Threading.Thread(Sub() MeineFunktion(indexChecked.ToString)) 
      ThreadList.Add(t) 
      t.Start() 


     Next 

    End Sub 
End Class 

konudur, konsol her zaman 2

yerine

, 1, 2

, 1,

1 verir

İlk öğe neden sürekli göz ardı ediliyor? Ben INTEGER olarak byval kullanıcı adının değiştirilmesi ve bu

Dim t As Threading.Thread = New Threading.Thread(Sub() MeineFunktion(indexChecked)) 

gibi değerini sneding yapıyor şimdiye kadar

çalıştı Ve yine aynı sorunu yaşamıştır Ne

. Ya iş parçacığımla veya konsol yazıcısını yapan işlevle (hata ayıklama yazdırmayı da denedim) ilgili bir şey var.

Ben Her iş parçacığı oluşturulur ve yayınlanmaya başlaması gereken biraz zamana ihtiyacı konuyu

+0

Bu bir "konsol" uygulaması mı? Ben bir modül göremediğim için soruyorum ... ama Visual Studio Konsolu'nda bulunan konsola yazdırıyorsunuz. Lütfen bunu açıklığa kavuşturun. Tercihen bir "liste kutusu" kullandığınız gibi bir 'winform' uygulaması olduğunu varsayalım ... – Codexer

+0

Bu bir windows uygulamasıdır. Ben şeylerin doğru çalışıp çalışmadığını görmek için konsolu görsel stüdyo konsolumda kullanıyorum. –

+1

Kötü biçim olan yineleme değişkenini kapatıyorsunuz. 'indexChecked', ilk iş parçacığınız başlamadan önce değişiyor. Bunu 'Her' için 'yeni bir yerel * içine kaydetmelisiniz. Dim CurentIndexChecked As Integer = indexChecked' gibi bir şey ekleyin ve 'indexChecked' yerine thread rutininiz için kullanın. –

cevap

0

neyin neden olduğunu tam olarak belirlemek mümkün değil. Bu iş parçacığı kullanmadan önce kullanıcı adı değiştiriyor gibi görünüyor. Her iş parçacığı başlatıldıktan hemen sonra küçük bir gecikme eklemeye çalışın:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim indexChecked As Integer 
    For Each indexChecked In CheckedListBox1.CheckedIndices 
     Dim t As Threading.Thread = New Threading.Thread(Sub() MeineFunktion(indexChecked.ToString)) 
     ThreadList.Add(t) 
     t.Start() 
     Do 
      Threading.Thread.Sleep(10) 
     Loop Until t.IsAlive 
    Next 
End Sub 
+1

Bu, sorunun * kaynağını * gidermediği için kötü bir çözümdür. İpucunuz başlamak için gecikmenizden uzun sürerse ne olur? Aynı teknede geri döndün. –

+0

@Glorin: Genel olarak MeineFunktion() 'i değiştirmek istemedim. 10 ms'den fazlası yeterli. Neyse, iş parçacığı tamamen oluşturuluncaya kadar bekleyebilirsiniz: Threading.Thread.Sleep (10) Döngü t.IsAlive – LMR

+0

LMR: 10 ms bu örnek_ için _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _. Ama ne ** eğer bu sadece _an example_? OP'nin gerçek kodu iş parçasının başında zaman alan bir şey yapıyorsa ne olur? Bunu bilmiyorsunuz, bu yüzden @GlorinOakenfoot ile aynı fikirdeyim. Bu geçici bir çözümdür. –

İlgili konular