C# ile çoklu iş parçacığı programlamada yeniyim. Benim sorunum, bir sonraki satıra devam etmeden önce bitirmek için başka bir iş parçacığında çalıştırılan bir yöntemi nasıl beklemem gerektiğini bilmem. Örneğin, buBaşka bir iş parçacığı üzerinde işlem yapmak için nasıl bir yöntem beklemeli?
public class A
{
int i;
public A()
{
i = 0;
}
protected void RunLoop()
{
while(i < 100)
{
i++;
}
}
public void Start()
{
TimerResolution.TimeBeginPeriod(1);
runThread = new Thread(new ThreadStart(RunLoop));
running = true;
runThread.Start();
}
}
public class B
{
A classAInstance = new A();
A.Start();
Console.Writeline(i);
}
gibi bir şey Şu anda, (yani i = 100) Benim istediğim bu değil ki, konsolda 0 yazdırır. Bunu yapmanın en iyi yolu nedir? BTW, class A
teşekkür oluşturulur runThread
erişimi yok.
DÜZENLEME:
Çok daha kodlarını değiştirmeden bu sorunu çözmek için biraz zordu. Bu nedenle, public void Start()
'da bir koşul ekleyerek, RunLoop
'un ayrı bir iş parçacığı içinde çalıştırılıp çalıştırılmayacağına karar verebildik. Durum, Enum
alanı kullanılarak tanımlandı. Yardım için
public void Start()
{
TimerResolution.TimeBeginPeriod(1);
running = true;
if (runningMode == RunningMode.Asynchronous)
{
runThread = new Thread(new ThreadStart(RunLoop));
runThread.Start();
}
else
{
RunLoop();
}
}
Ve
public enum RunningMode { Asynchronous, Synchronous };
teşekkürler herkese.
, muhtemelen diğer iş parçacığı üzerinde neler olup bittiğini tespit edemez:
Kodunuz bu basit olabilir. İş parçacığı örneğine erişiminiz varsa, 'Thread.Join' kullanarak bitirmesini bekleyebilirsiniz, ancak buna sahip değilseniz, sorun çözülemez. Senkronizasyon işbirliği gerektirir. –
Tesadüfen, kodunuz 'A.i' ye erişimimiz olmadığı için derlenemez (ve eğer yaparsak, iş parçacığı güvenli olmaz). Öyleyse, iş parçanız devleti paylaşıyor mu, yapmıyor mu? Senin gerçek * problemin nedir ve neden açık bir iş parçacığı gerektirdiğini düşünüyorsun? –
* İş parçacığı kullanma * yerine, görev bittiğinde bazı eylemleri gerçekleştirmek için Görevler ve 'bekletme ',' Devam Et', Bekle() 'vb. Tanımladığınız senaryonun basitleştirilmesi için yaratılmışlardır (en azından) –