C# 带手动复位事件的foreach中的计时器

C# 带手动复位事件的foreach中的计时器,c#,foreach,timer,manualresetevent,C#,Foreach,Timer,Manualresetevent,当我单击按钮时,循环开始读取数据库并将查询的每一行发送到另一台服务器。当得到响应时,循环继续 代码实现如下 private ManualResetEvent _mre = new ManualResetEvent(true); 及 问题是,何时发送请求可能不是答案。在我的情况下,这是正常的。但如果答案是否定的,那么循环就停止了。我需要在循环计时器内执行此操作,在由于缺少响应而停止循环的情况下,将在30秒内继续循环 计时器将不得不这样做 _mre.Set(); 重要提示:您正在将ManualR

当我单击按钮时,循环开始读取数据库并将查询的每一行发送到另一台服务器。当得到响应时,循环继续

代码实现如下

private ManualResetEvent _mre = new ManualResetEvent(true);

问题是,何时发送请求可能不是答案。在我的情况下,这是正常的。但如果答案是否定的,那么循环就停止了。我需要在循环计时器内执行此操作,在由于缺少响应而停止循环的情况下,将在30秒内继续循环

计时器将不得不这样做

_mre.Set();

重要提示:您正在将
ManualResetEvent
初始状态设置为
true
,如果您愿意停止当前进程并等待信号,请将其设置为
false

编辑:

范例


问题到底出在哪里?你想得到什么?你能再详细一点吗?@pasty例如,当在foreach中时:timer=newsystem.Threading.timer(newtimercallback(DoSomething),null,0,30000);循环没有等待答案。因为现在我有了这个算法:1)读取数据库,2)引入一个临时表,3)在临时表中开始循环,4)查询中的每一行,5)当答案出现并更新数据库时,我们继续循环。是否可以在AutoResetEvent的帮助下手动继续循环?@alexander是的,但是你可以用ManualResetEvent做同样的事情。请记住,您需要将初始状态更改为false。@在代码中,当您声明和初始化ManualResetEvent时,需要在其构造函数中传递“false”。private ManualResetEvent _mre=新的ManualResetEvent(错误);//你不需要自动回复,这只是我最初的想法。我将用一个例子来编辑我的答案。
_mre.Set();
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();
}