نوشته شده توسط
SabaSabouhi
منظورتون رو متوجه نشدم. یعنی شما در UI Threadاز Sleep استفاده میکنید؟ چه نکته ای در استفاده از Sleep هست؟ فراخوانی Sleep هیچ کاری جز متوقف کردن Thread جاری انجام نمیده، حالا شما اگه Thread دیگه ای نداشته باشین که براتون کار انجام بده Sleep فقط باعث هنگ کردن UI میشه.
نوشته شده توسط
ArtStyle
ممنون از راهنماییتون منم همین کارو قبلا انجام دادم ولی مشکلم اینه که وقتی اسلیپ میزنم باید زمان تعیین شده باشه ولی من میخوام با این اسلیپ برنامه بره سراغ Data_Receive و وقتی کارش اونجا تموم شد بلافاصله برگرده به Thread اصلی .
آیا راهی هست که بشه Thread ای که اسلیپ کردم رو بش بگم بعد از اتمام Data_Receive دوباره به کارش ادامه بده قبل از این که تایم اسلیپ تموم شه ؟ چون زمان خیلی مهمه اگه 20 میلی ثانیه بیشتر شه امکان داره مقادیرم دچار مشکل شه
شما تا وقتی دو Threadنداشته باشید که نمیتونید اون رو هم Sleep کنید و هم در اجرای متد Data_Receive داشته باشید. اگه شما Data_Receive رو مثلا در Thread1 در حال اجرا داشته باشید، وقتی در UI Thread هستین با استفاده از متد Thread.Join میتونید Thread جاری رو تا اتمام Thread1 متوقف کنید.
برای استفاده از Parameter موقع ایجاد Thread میتونید به این روش عمل کنید:
class Data_ReceiveParams {
public int Parameter1 {
get;
set;
}
public int Parameter2 {
get;
set;
}
}
private void button1_Click_9(object sender, EventArgs e) {
var thredStart = new ParameterizedThreadStart(DoSomeOperation);
var dataReceiveParams = new Data_ReceiveParams();
dataReceiveParams.Parameter1 = 10;
dataReceiveParams.Parameter2 = 15;
Thread thread = new Thread(thredStart);
thread.Start(dataReceiveParams);
}
private void DoSomeOperation(object dataReceiveParams) {
Data_ReceiveParams dParams = (Data_ReceiveParams)dataReceiveParams;
Data_Receive(dParams.Parameter1, dParams.Parameter2);
this.BeginInvoke((MethodInvoker) delegate { this.NotifyOperationsDone()});
}
private void Data_Receive(int parameter1, int parameter2) {
// Do lengthy operation
}
private void NotifyOperationsDone() {
// Here we are in UI thread
MessageBox.Show("Done!");
}