带有 ManualResetEvent 的 foreach 中的计时器
Timer in foreach with ManualResetEvent
当我单击按钮时,循环开始读取数据库并将查询的每一行发送到另一台服务器。当得到响应时 - 循环继续。
代码实现如下
private ManualResetEvent _mre = new ManualResetEvent(true);
和
Thread startUpload = new Thread(() =>
{
//read database
foreach (DataRow dr in dt.Rows)
{
//send request
_mre.WaitOne();
}
});
startUpload.Start();
问题是发送请求时可能没有答案。就我而言,这是正常的。但如果没有,答案就来了,然后循环停止。我需要在循环定时器里面做,在由于没有响应而停止循环的情况下,它会在 30 秒内继续循环。
计时器将不得不做
_mre.Set();
重要提示:您正在将 ManualResetEvent
初始状态设置为 true
,如果您愿意,请将其设置为 false
停止当前进程并等待信号。
编辑:
例子
private ManualResetEvent _mre = new ManualResetEvent(false);
private void ReadTheDatabase()
{
Thread startUpload = new Thread(() =>
{
// Read the data
foreach (DataRow dr in dt.Rows)
{
// Send request
Thread requestMethod = new Thread(() =>
{
// Imitate process with thread sleep
Thread.Sleep(5000);
_mre.Set();
});
requestMethod.Start();
_mre.WaitOne(30000, false);
}
});
startUpload.Start();
}
当我单击按钮时,循环开始读取数据库并将查询的每一行发送到另一台服务器。当得到响应时 - 循环继续。
代码实现如下
private ManualResetEvent _mre = new ManualResetEvent(true);
和
Thread startUpload = new Thread(() =>
{
//read database
foreach (DataRow dr in dt.Rows)
{
//send request
_mre.WaitOne();
}
});
startUpload.Start();
问题是发送请求时可能没有答案。就我而言,这是正常的。但如果没有,答案就来了,然后循环停止。我需要在循环定时器里面做,在由于没有响应而停止循环的情况下,它会在 30 秒内继续循环。
计时器将不得不做
_mre.Set();
重要提示:您正在将 ManualResetEvent
初始状态设置为 true
,如果您愿意,请将其设置为 false
停止当前进程并等待信号。
编辑:
例子
private ManualResetEvent _mre = new ManualResetEvent(false);
private void ReadTheDatabase()
{
Thread startUpload = new Thread(() =>
{
// Read the data
foreach (DataRow dr in dt.Rows)
{
// Send request
Thread requestMethod = new Thread(() =>
{
// Imitate process with thread sleep
Thread.Sleep(5000);
_mre.Set();
});
requestMethod.Start();
_mre.WaitOne(30000, false);
}
});
startUpload.Start();
}