Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以随机间隔在随机时间内暂停执行_C#_Multithreading - Fatal编程技术网

C# 如何以随机间隔在随机时间内暂停执行

C# 如何以随机间隔在随机时间内暂停执行,c#,multithreading,C#,Multithreading,我又回来了。。。已经 作为我程序的第二部分,我需要能够以随机间隔暂停我的程序-例如,在程序运行10分钟后,它会暂停20秒,在程序运行47分钟后,它会暂停3分钟49毫秒。。。差不多吧。我现在还不打算尝试,因为我发现的所有东西都太复杂了,我小小的大脑无法理解,所以如果有人能帮我把它分解,那就太好了 下面是我的代码,我需要暂停for循环中的位。谢谢 而且,我知道我已经让它点击,睡觉,点击,睡觉,然后重复循环-我想要这样:) 使用系统; 使用System.Collections.Generic; 使用系

我又回来了。。。已经

作为我程序的第二部分,我需要能够以随机间隔暂停我的程序-例如,在程序运行10分钟后,它会暂停20秒,在程序运行47分钟后,它会暂停3分钟49毫秒。。。差不多吧。我现在还不打算尝试,因为我发现的所有东西都太复杂了,我小小的大脑无法理解,所以如果有人能帮我把它分解,那就太好了

下面是我的代码,我需要暂停for循环中的位。谢谢 而且,我知道我已经让它点击,睡觉,点击,睡觉,然后重复循环-我想要这样:)

使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
使用系统线程;
使用System.Runtime.InteropServices;
名称空间MagicMouse
{
公共部分类Form1:Form
{
//所有这些都与能够真正点击鼠标有关
//[DllImport(“user32.dll”,CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
//公共静态外部无效鼠标事件(长dwFlags、长dx、长dy、长cButtons、长dwExtraInfo);
[DllImport(“user32.dll”)]
公共静态外部无效鼠标事件(int-dwFlags、int-dx、int-dy、int-dwData、int-dwExtraInfo);
private const int MOUSEEVENTF_LEFTDOWN=0x02;
private const int MOUSEEVENTF_LEFTUP=0x04;
private const int MOUSEEVENTF_RIGHTDOWN=0x08;
private const int MOUSEEVENTF_RIGHTUP=0x10;
//此函数将使用指定给它的参数单击鼠标
public void DoMouseClickLeft()
{
//使用光标的当前位置调用导入的函数
int X=游标.Position.X;
int Y=游标.Position.Y;
鼠标事件(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP,X,Y,0,0);
}
public void NumberCheck(字符串验证枚举)
{
长癌变率=0;
bool CanConvertBool=long.TryParse(validateum,out CanConvertOut);
if(CanConvertBool==false)
{
MessageBox.Show(“请输入有效数字”);
返回;
}
}
//这将生成用于睡眠计时器的随机数
私有整数随机数(最小整数,最大整数)
{
随机=新随机();
返回random.Next(最小值、最大值);
}
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
}
//按钮1正在开始单击
私有无效按钮1\u单击(对象发送者,事件参数e)
{
//本节向数字验证功能发送数据
字符串validateEnum=NumberOfItems.Text;
NumberCheck(验证枚举);
int Clicks=Convert.ToInt16(NumberOfItems.Text);
对于(int i=1;i
尝试以下方法:

private DateTime GetNextSleep()
{
    // Between 3 and 20 minutes, adjust as needed.
    return DateTime.Now + new TimeSpan(0, 0,
        RandomNumber(60 * 3, 60 * 20));
}

private void button1_Click(object sender, EventArgs e)
{
    //this section sends data to the number validation function
    string ValidateNum = NumberOfItems.Text;
    NumberCheck(ValidateNum);
    int Clicks = Convert.ToInt16(NumberOfItems.Text);

    DateTime nextSleep = GetNextSleep();

    for (int i = 1; i < Clicks; i++)
    {
        int SleepTime1 = RandomNumber(819, 1092);
        DoMouseClickLeft();
        Thread.Sleep(SleepTime1);
        DoMouseClickLeft();
        Thread.Sleep(SleepTime1);

        if (DateTime.Now >= nextSleep)
        {
            // Sleep between 1 and 5 minutes, adjust as needed.
            Thread.Sleep(new TimeSpan(0, 0,
                RandomNumber(60 * 1, 60 * 5)));

            nextSleep = GetNextSleep();
        }
    }
}
private DateTime GetNextSleep()
{
//在3到20分钟之间,根据需要进行调整。
返回日期时间。现在+新的时间跨度(0,0,
随机数(60*3,60*20);
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
//本节向数字验证功能发送数据
字符串validateEnum=NumberOfItems.Text;
NumberCheck(验证枚举);
int Clicks=Convert.ToInt16(NumberOfItems.Text);
DateTime nextSleep=GetNextSleep();
对于(int i=1;i=nextSleep)
{
//睡眠1到5分钟,根据需要进行调整。
Thread.Sleep(新的时间跨度(0,0,
随机数(60*1,60*5);
nextSleep=GetNextSleep();
}
}
}
基本上,您可以预先计算要暂停的时间。一旦这个时间到来,您将随机睡眠一段时间,计算下一个睡眠时间,然后返回循环

        using (var taskHandle = new ManualResetEvent(false))
        {
            taskHandle.WaitOne(wait * 1000);
        }

是比线程睡眠更好的方法(等待*1000)

当我删除某些MessageBox时,我可能会把代码弄得有点乱,但是应该只缺少一个分号:):PDo你真的想在应用程序暂停时阻止整个UI吗?用户将无法使用它做任何事情-单击“关闭”将不起作用,移动它将不起作用等。通常最好禁用任何活动控件(等),但保持UI线程本身工作。嗨,cdhowie,这似乎是一个很好的解决方案,然而,我想到了一个noob想法。上一次我玩时间(哈哈),把一个函数,让时间在一个循环相当慢我的程序。这是以不同的方式工作,还是我会经历相同类型的延迟?是的,
DateTime。现在,
accessor是一个相对昂贵的调用。如果重要的话,你可以考虑调整你的<代码>睡眠时间1>代码>变量来补偿。从外观上看,您不会选择非常具体的时间,因此我不确定这会对您的代码产生多大影响。解决方法是每N次迭代检查一次时间(检查
i%N==0
),这将减少
        using (var taskHandle = new ManualResetEvent(false))
        {
            taskHandle.WaitOne(wait * 1000);
        }