Winform异步解决窗体耗时操作(Action专门用于无返回值,Func专门用于有返回值)
http://blog.csdn.net/config_man/article/details/25578767
- #region 调用timer控件实时查询开关机时间
- private void timer1_Tick(object sender, EventArgs e)
- {
- string sql = "SELECT startTime,endTime,AMTusername,AMTpassword,AMTip FROM AmtTiming at, AmtComputer ac WHERE at.cid = ac.id";
- List<TimingBean> list = new Database().getRS(sql);
- if (list != null && list.Count > 0)
- {
- foreach (TimingBean tb in list)
- {
- string startTime = tb.StartTime;
- string endTime = tb.EndTime;
- string AMTusername = tb.AMTUsername;
- string AMTpassword = tb.AMTPassword;
- string AMTip = tb.AMTIp;
- string now = DateTime.Now.ToShortTimeString();
- if (startTime == now)
- {
- Action<string, string, string, bool> action = new Action<string, string, string, bool>(StartOrShutDown);
- action.BeginInvoke(AMTusername, AMTpassword, AMTip, true, null, null);
- }
- else if (endTime == now)
- {
- Action<string, string, string, bool> action = new Action<string, string, string, bool>(StartOrShutDown);
- action.BeginInvoke(AMTusername, AMTpassword, AMTip, false, null, null);
- }
- }
- }
- }
- private void StartOrShutDown(string user, string pass, string ip, bool isStart)
- {
- AmtRemoteAControl amtControl = new AmtRemoteAControl();
- if (isStart)
- {
- //如果开机不成功,则让其再执行一次
- try
- {
- amtControl.SendPowerOnCmd(ip, user, pass);
- }
- catch
- {
- try
- {
- amtControl.SendPowerOnCmd(ip, user, pass);
- }
- catch (Exception e)
- {
- MessageBox.Show("终端设备:" + ip + "自动开机失败。异常信息:" + e.Message);
- }
- }
- }
- else
- {
- //如果关机不成功,则让其再执行一次
- try
- {
- amtControl.SendPowerOffCmd(ip, user, pass);
- }
- catch
- {
- try
- {
- amtControl.SendPowerOffCmd(ip, user, pass);
- }
- catch (Exception e)
- {
- MessageBox.Show("终端设备:" + ip + "自动关机失败。异常信息:" + e.Message);
- }
- }
- }
- }
- #endregion
- #region 开关机、重启 "查询按钮"
- bool has = false;
- private void button1_Click(object sender, EventArgs e)
- {
- //获得省份索引和某个市的文本
- int index = this.comboBox1.SelectedIndex;
- if (0 == index)
- {
- MessageBox.Show("请选择区域!"); return;
- }
- else
- {
- #region 获取选择的区域
- this.buttonStart.Enabled = false;
- this.buttonShutdown.Enabled = false;
- this.buttonReStart.Enabled = false;
- string place = this.comboBox1.Text; //省
- int city_index = this.comboBox2.SelectedIndex;//市
- string county = this.comboBox3.Text; //区县
- //如果城市有选择
- if (city_index != 0)
- {
- place = place + this.comboBox2.Text;
- }
- //如果区县有选择
- if ((null != county) && (!((string.Empty).Equals(county))) && (!"--请选择--".Equals(county)))
- {
- place = place + county;
- }
- #endregion
- try
- {
- #region 将查到的设备信息绑定到数据表格
- //将查到的设备信息绑定到数据表格
- //string sql = "SELECT '' as '选择',cp.en '设备编号',cp.ip '设备IP',cp.place '设备地址', cp.AMTusername '用户名',cp.AMTpassword '密码',cp.AMTip 'IP',cp.id '主键',cp.status '状态' FROM AmtComputer cp WHERE cp.place like '%" + place + "%'";
- string sql = "SELECT cp.en '设备编号',cp.ip '设备IP',cp.place '设备地址', cp.AMTusername '用户名',cp.AMTpassword '密码',cp.AMTip 'IP',cp.id '主键',cp.status '状态' FROM AmtComputer cp WHERE cp.place like '%" + place + "%'";
- Database db = new Database();
- DataSet ds = db.getDS(new DataSet(), sql);
- DataTable table = ds.Tables["data"];
- this.bindingSource1.DataSource = table;
- this.dataGridView1.DataSource = this.bindingSource1;
- if(!has)
- {
- //添加复选框
- DataGridViewCheckBoxColumn box = new DataGridViewCheckBoxColumn();
- box.HeaderText = "选择";
- box.Name = "选择";
- this.dataGridView1.Columns.Insert(0, box);
- has = true;
- }
- //设置部分列为不可见状态
- this.dataGridView1.Columns["用户名"].Visible = false;//AMT用户名
- this.dataGridView1.Columns["密码"].Visible = false;//AMT密码
- this.dataGridView1.Columns["IP"].Visible = false;//AMT设备ip
- this.dataGridView1.Columns["主键"].Visible = false;//主键
- this.dataGridView1.Columns["选择"].Width = 60;//复选框
- this.dataGridView1.Columns["设备编号"].Width = 100;//设备编号
- this.dataGridView1.Columns["设备IP"].Width = 140;//设备IP
- this.dataGridView1.Columns["设备地址"].Width = 160;//设备地址
- this.dataGridView1.Columns["状态"].Width = 180;//状态
- #endregion
- //this.labelState.Text = "正在获取设备状态,请稍后...";
- //this.Refresh();
- int count = table.Rows.Count;
- for (int i = 0; i < count; i++)
- {
- string username = table.Rows[i]["用户名"].ToString(); //amt用户名
- string password = table.Rows[i]["密码"].ToString(); //amt密码
- string host = table.Rows[i]["IP"].ToString(); //amtIP地址
- this.dataGridView1.Rows[i].Cells["状态"].Value = "正在获取终端状态...";
- this.dataGridView1.Rows[i].Cells["状态"].Style.ForeColor = Color.Red;
- this.dataGridView1.Rows[i].Cells["状态"].Style.Font = new Font("宋体", 11F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
- Func<int, string, string, string, string> func = new Func<int, string, string, string, string>(getPowerState);
- func.BeginInvoke(i, username, password, host,
- (result) =>
- {
- string state = func.EndInvoke(result);
- this.BeginInvoke(new Action<string>(setStateValue), state);
- }, null);
- }
- }
- catch (Exception ee) { MessageBox.Show(ee.Message); }
- }
- }
- private void setStateValue(string state)
- {
- string[] array = state.Split(',');
- this.dataGridView1.Rows[Convert.ToInt16(array[0])].Cells["状态"].Value = array[1];
- this.buttonStart.Enabled = true;
- this.buttonShutdown.Enabled = true;
- this.buttonReStart.Enabled = true;
- }
- #endregion
- #region 获取amt设备的当前电源状态
- private string getPowerState(int index,string username, string password, string host)
- {
- ConnectionInfo info = new ConnectionInfo(host, username, password, false,
- string.Empty, ConnectionInfo.AuthMethod.Digest,
- null, null);
- DotNetWSManClient wsman = new DotNetWSManClient(info);
- RemoteControlApi api = new RemoteControlApi(wsman);
- try
- {
- CIM_AssociatedPowerManagementService service = api.GetCurrentPowerState(true);
- ushort state = service.PowerState;
- if (state == 2)
- {
- return index + ",开机";
- }
- else if (state == 8)
- {
- return index + ",关机";
- }
- }
- catch
- {
- try
- {
- CIM_AssociatedPowerManagementService service = api.GetCurrentPowerState(false);
- ushort state = service.PowerState;
- if (state == 2)
- {
- return index + ",开机";
- }
- else if (state == 8)
- {
- return index + ",关机";
- }
- }
- catch (Exception e2)
- {
- return index + "," + e2.Message;
- }
- }
- return index + ",未知";
- }
- #endregion
Winform异步解决窗体耗时操作(Action专门用于无返回值,Func专门用于有返回值)的更多相关文章
- winform 开发中 把耗时操作 封装起来 异步执行(.net 4.0)
.先定义一个 BackgroundTask.cs 代码如下: public class BackgroundTask { private static WaitDialogForm LoadingDl ...
- 事件异步(EAP)使用事件异步处理一些耗时操作
比如需要下载一些比较大的文件,如果使用会UI卡顿,使用异步可以节省一些时间 下面是一些例子: using System; using System.Collections.Generic; using ...
- Winform 界面执行耗时操作--UI卡顿假死问题
UI卡顿假死问题 误区1:使用不同的线程操作UI控件和耗时操作(即,跨线程操作UI控件CheckForIllegalCrossThreadCalls = false;), 注意:此处只是为了记录... ...
- 异步委托(APM)使用Func异步操作,处理耗时操作
使用委托进行异步操作,处理一些耗时操作,防止主线程阻塞 使用例子: using System; using System.Collections.Generic; using System.Linq; ...
- C# winform解决解决窗体第一次设置为最大化后,点击最大化按钮窗体无法居中问题
public frmMain() { InitializeComponent(); //解决窗体第一次设置为最大化后,点击最大化按钮窗体无法居中问题 int x = Convert.ToInt32(( ...
- 谈.Net委托与线程——解决窗体假死
转自:http://www.cnblogs.com/smartls/archive/2011/04/08/2008981.html#2457370 引言 在之前的<创建无阻塞的异步调用> ...
- C# 解决窗体假死的状态
异步调用是CLR为开发者提供的一种重要的编程手段,它也是构建高性能.可伸缩应用程序的关键.在多核CPU越来越普及的今天,异步编程允许使用非常少的线程执行很多操作.我们通常使用异步完成许多计算型.IO型 ...
- ASP.NET服务器端执行耗时操作的工作记录
公司之前有这样一个业务需求: 一名同事做出文件a0和b0,然后将a0加密为a1.b0加密为b1:再将文件a0.a1.b0和b1上传至服务器M:同时要将服务器N上的数据表添加一条记录,该记录的ID就是前 ...
- (二十三)c#Winform自定义控件-等待窗体
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
随机推荐
- 01 while 循环输入1 2 3 4 5 6 8 9 10
start = 1while True: if start == 7: start += 1 continue print(start) start ...
- rest-framework 序列化格式Restful API设计规范
理解RESTful架构 Restful API设计指南 理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式 ...
- 【2017-04-17】类库、通用变量、is和as、委托
类库dll文件,里边有很多被编译后的C#代码,不可阅读,不可修改,只能调用 1.类库创建 新建项目为类库,类库文件编写完成后,选择生成—生成解决方案,在debug文件夹下找到dll文件 2.类库引用 ...
- 【2017-2-23】C#switch case分支语句,for循环语句
switch case分支语句 switch(一个变量值) { case 值:要执行的代码段;break; case 值:要执行的代码段;break; … default:代码段;break;(def ...
- Spring 无缝整合 quartz
关键步骤: 1. 配置 SchedulerFactoryBean <bean class="org.springframework.scheduling.quartz.Schedule ...
- 20165305 苏振龙《Java程序设计》第七周学习总结
第十一章 JDBC技术在数据库开发中占有很重要的地位,JDBC操作不同的数据库仅仅是连接方式上的差异而已,使用JDBC的应用程序一旦和数据库建立连接,就可以使用JDBC提供的API操作数据库. 当查询 ...
- bootstrapValidator验证表单后清除当次验证的方法
用bootstrapValidator的resetForm()方法: <!-- // create server begin --> <div class="modal f ...
- 使用Ajax出现302 Moved Temporarily
现象:在用ajax发送请求时,各种参数都对,地址也对,一直进error返回parse error. 使用浏览器发现ajax请求的header的响应码处:302 Moved Temporarily 百度 ...
- AirTest源码分析之运行器
from: https://blog.csdn.net/u012897401/article/details/82900562 使用:根据airtest文档说明,可以通过命令行来启动air脚本,需要传 ...
- FJOI2019游记
应该是.....尽力了吧 day0:下午到酒店,晚上魔兽(with lyc)+雀魂.心里也清楚,今年只是来观光的. day1:上午暴力打完走人.下午和晚上魔兽+雀魂+300. day2:暴力打到一半拉 ...