Мне нужна простая функция ожидания, которая позволяет обрабатывать события браузера и является поточно-ориентированной. Коллега сказал, что никогда не следует использовать DoEvents при работе с несколькими потоками.
Я замечаю, что когда я использую Thread.Sleep(10000);
, моя активность в браузере приостанавливается до тех пор, пока сон не будет завершен.
Кто-нибудь может порекомендовать альтернативу?
Вот код для просмотра:
public static int f_sleep(int time)
{
System.DateTime now = System.DateTime.Now;
System.TimeSpan duration = new System.TimeSpan(0, 0, 0, time);
System.DateTime then = now.Add(duration);
Thread this_thread = Thread.CurrentThread;
while (then > DateTime.Now)
{
//MessageBox.Show("NewTime:" + then + "Now:" + DateTime.Now);
//we do not want to use this because it's said to mess up multithreading
Application.DoEvents();
//Thread.CurrentThread.Sleep(10);
Thread.Sleep(10);
}
return 1;
}
private void f_run_selected_campaigns(object sender, EventArgs e)
{
jobs_datagrid.EndEdit();
int count_active = 0;
foreach (DataGridViewRow row in jobs_datagrid.Rows)
{
//MessageBox.Show(row.Cells[1].Value.ToString());
if (row.Cells[1].Value.ToString() == "True")
{
count_active++;
//troubleshooting
Thread this_thread = new Thread(() =>
this.Invoke((MethodInvoker)delegate
{
test("hello");
}
));
//threading properties
this_thread.Name = "thread_" + row.Cells[0].Value.ToString();
this_thread.IsBackground = true;
this_thread.Start();
}
}
if (count_active == 0)
{
MessageBox.Show("No campaigns are selected!");
}
}
private void test(string this_string)
{
MessageBox.Show(this_string);
//Thread.Sleep(1000);
f_sleep(10); //for some reason Thread.Sleep does not work well with my browser loading waiting so I drew this up to create a temp pause in the code logic, but it's causing my threads to not run asychronously
MessageBox.Show("Thread Done");
}
Я все еще не могу найти решение для этого. Я думаю, что существует простой метод, который может приостановить поток логики, позволяя обрабатывать элементы пользовательского интерфейса и веб-браузеры.
Прямо сейчас я использую эти два для своих нужд обработки, вернется ли это, чтобы укусить меня, когда я многопоточен ... Я не знаю.
private int WaitBrowserLoading(Control browser)
{
lock(_locker)
{
tabcontrol_browser.Invoke((MethodInvoker) delegate {
for (int i = 0; i < 1000000; i++)
{
if(((WebBrowser)browser).ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
Thread.Sleep(10);
}else
{
break;
}
}
});
return 1;
}
}
public static int f_sleep(int time)
{
System.DateTime now = System.DateTime.Now;
System.TimeSpan duration = new System.TimeSpan(0, 0, 0, time);
System.DateTime then = now.Add(duration);
while (then > DateTime.Now)
{
Application.DoEvents();
Thread.Sleep(10);
}
return 1;
}