当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态。此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。
一旦它被终止,ManualResetEvent 将保持终止状态,直到它被手动重置。即对 WaitOne 的调用将立即返回。
首先要完成对他的初始化:
private static ManualResetEvent mre = new ManualResetEvent(false);
public static void func() //截屏函数
{
int width = Screen.PrimaryScreen.Bounds.Width;
int height = Screen.PrimaryScreen.Bounds.Height;
Bitmap btm = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(btm))
{
g.CopyFromScreen(0, 0, 0, 0, Screen.AllScreens[0].Bounds.Size);
g.Dispose();
string save = "F:\\" + DateTime.Now.ToString("yyyymmddhhmmssmmmm") + ".jpg";
btm.Save(save);
MessageBox.Show("抓屏完成!");
}
}
public void method()
{
while (true)
{
mre.WaitOne();
func();//
mre.Reset();
}
}
以委托创建线程:
private void button2_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(method));//创建线程
thread.Start(); //启动线程
}
调用set
private void button1_Click(object sender, EventArgs e)
{
mre.Set();
}
整体代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace 抓屏
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private static ManualResetEvent mre = new ManualResetEvent(false);
public static void func() //截屏函数
{
int width = Screen.PrimaryScreen.Bounds.Width;
int height = Screen.PrimaryScreen.Bounds.Height;
Bitmap btm = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(btm))
{
g.CopyFromScreen(0, 0, 0, 0, Screen.AllScreens[0].Bounds.Size);
g.Dispose();
string save = "F:\\" + DateTime.Now.ToString("yyyymmddhhmmssmmmm") + ".jpg";
btm.Save(save);
MessageBox.Show("抓屏完成!");
}
}
private void button1_Click(object sender, EventArgs e)
{
mre.Set();
}
public void method()
{
while (true)
{
mre.WaitOne();
func();//
mre.Reset();
}
}
private void button2_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(method));//创建线程
thread.Start(); //启动线程
}
}
}