הפסקה והתחלה לסרוגין של תהליך
-
נניח שאני עושה לולאה, ואני רוצה להספיק באמצע. אבל להמשיך אחרי קבלת ארוע מהתשמש אבל בדיוק באתו מקום.
אני עובד עם backgroundWorker, ויש לו אפשרות ביטול אבל לא Resumeהקוד כרגע נראה כך:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
int sum = 0;
for (int i = 1; i < 101; i++)
{
sum += i;
//כאן שיהא איזה אפשרות לעצור להמשיך מחדש
backgroundWorker1.ReportProgress(i);
}
label1.Text = sum.ToString();
}פורסם במקור בפורום CODE613 ב09/11/2016 12:56 (+02:00)
-
אין בBackgroundWorker פישוט לעניין הזה. אז צריך להזיע, ולעבוד עם הכלים המעצבנים של טרידים.
חיפשתי באינטרנט ומצאתי http://stackoverflow.com/questions/142826/is-there-a-way-to-indefinitely-pause-a-thread.
העתקתי לדוגמה מתאימה עם BackgroundWorker:ManualResetEvent _suspendEvent = new ManualResetEvent(true); private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { int sum = 0; for (int i = 1; i < 101; i++) { sum += i; //בדיקה האם יש השהיה _suspendEvent.WaitOne(Timeout.Infinite); backgroundWorker1.ReportProgress(i); Thread.Sleep(100); } e.Result = sum; } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { this.Text = e.ProgressPercentage.ToString(); } //התחלה private void button1_Click(object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync(); } //אירוע סיום private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { label1.Text = e.Result.ToString(); } //השהיה private void button2_Click(object sender, EventArgs e) { _suspendEvent.Reset(); } //הפעלה מחדש private void button3_Click(object sender, EventArgs e) { _suspendEvent.Set(); }
פורסם במקור בפורום CODE613 ב09/11/2016 18:53 (+02:00)
-
נניח שאני עושה לולאה, ואני רוצה להספיק באמצע. אבל להמשיך אחרי קבלת ארוע מהתשמש אבל בדיוק באתו מקום.
אני עובד עם backgroundWorker, ויש לו אפשרות ביטול אבל לא Resumeהקוד כרגע נראה כך:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
int sum = 0;
for (int i = 1; i < 101; i++)
{
sum += i;
//כאן שיהא איזה אפשרות לעצור להמשיך מחדש
backgroundWorker1.ReportProgress(i);
}
label1.Text = sum.ToString();
}פשוט תשים לולאה ריקה שלא עושה כלום רק מסתובבת עד קבלת הארוע. זה מה שלמעשה עושה sleep מאחורי הקלעים.
פורסם במקור בפורום CODE613 ב09/11/2016 21:00 (+02:00)
-
פשוט תשים לולאה ריקה שלא עושה כלום רק מסתובבת עד קבלת הארוע.
זה לא שיקול לא לעשות כן מבחינת פרפומנס?
ואגב אציין שניסתי לעשות מולטיטרדינג עצמאי, אבל הוא כתב שהפקדים לא יכולים להציג נתונים מטרייד שלא נוצרו בו...
פורסם במקור בפורום CODE613 ב09/11/2016 23:14 (+02:00)
-
הוא עדיין כותב לי את השגיאה שהוא לא יכול לטפל בפקדים שלא נוצרו באותו טרייד, אז הבנתי שאני צריך ל"הוציא" החוצה מהוורקר את מה שאני רוצה להתשמש בו בפקדים. ההתקדמות יכולה להראות גם אחוזים אבל אפשר גם להעביר אוביקט. וכרגע הקוד נראה כך:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { int sum = 0; for (int i = 1; i < 101; i++) { sum += i; backgroundWorker1.ReportProgress(i, sum.ToString()); _suspendEvent.WaitOne(Timeout.Infinite); Thread.Sleep(100); } } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; label1.Text = (string)(e.UserState); }
פורסם במקור בפורום CODE613 ב09/11/2016 23:42 (+02:00)