需要你的帮助。我想做的是什么呢?我基本上是对定义的IP范围进行SNMP请求,并在DataTable上显示他们是否可到达Pingable。我可以把SNMP请求作为一个单独的任务运行,但我无法用结果更新DataTable。因为gridControl运行在自己的线程上。
请帮助我。我把我的代码粘贴在下面。
public partial class Discovery : DevExpress.XtraEditors.XtraForm
{
DataTable dt = null;
public Discovery()
{
InitializeComponent();
simpleButton2.Enabled = false;
dt = new DataTable();
gridControl1.DataSource = CreateColumns(dt);
}
private DataTable CreateColumns(DataTable dt)
{
dt.Columns.Add("#", typeof(int));
dt.Columns.Add("IP Address", typeof(string));
dt.Columns.Add("Username", typeof(string));
dt.Columns.Add("Password", typeof(string));
dt.Columns.Add("Firmware Version", typeof(string));
return dt;
}
private async void simpleButton1_Click(object sender, EventArgs e)
{
await SnmpRequest();
//dt = CreateData(0);
//this.ShowGrid(dt);
simpleButton2.Enabled = true;
}
private async Task SnmpRequest()
{
await Task.Run(() =>
{
for (int i = 130; i < 140; i++)
{
string ipAddress = "192.168.10." + i;
try
{
var result = Messenger.Get(VersionCode.V1,
new IPEndPoint(IPAddress.Parse(ipAddress), 161),
new OctetString("public"),
new List<Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) },
2000);
foreach (var el in result)
{
string[] obj = new string[2];
obj[0] = ipAddress;
obj[1] = el.Data.ToString();
MethodToAdd(obj);
}
}
catch (Exception ex)
{
string[] obj = new string[2];
obj[0] = ipAddress;
obj[1] = ex.Message;
MethodToAdd(obj);
}
}
});
}
delegate void test(object[] strArr);
private void MethodToAdd(string[] str)
{
object[] objArr = new object[2];
objArr[0] = str[0];
objArr[1] = str[1];
gridView1.BeginInvoke(new test(PutLog), new object[] { str });
}
private void PutLog(object[] obj)
{
gridView1.AddNewRow();
gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[0], "1");
gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[1], obj[0]);
gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[2], "3");
gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[3], "4");
gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[4], obj[1]);
gridView1.UpdateCurrentRow();
}
private void PutLog(string[] str)
{
gridView1.AddNewRow();
gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[0], "1");
gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[1], str[0]);
gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[2], "3");
gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[3], "4");
gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[4], str[1]);
gridView1.UpdateCurrentRow();
}
}
输出:-如下图所示错误参数2:无法将测试转换为System.Action。
方法 BeginInvoke
需要一个代表 不接受任何参数. 你要发送两个。
你可以简化你的代码,把
foreach (var el in result)
{
string[] obj = new string[2];
obj[0] = ipAddress;
obj[1] = el.Data.ToString();
MethodToAdd(obj);
}
与
foreach (var el in result)
{
gridView1.GridControl.BeginInvoke((Action) (() =>
{
gridView1.AddNewRow();
gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[0], "1");
gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[1], ipAddress);
gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[2], "3");
gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[3], "4");
gridView1.SetRowCellValue(gridView1.FocusedRowHandle, gridView1.Columns[4], el.Data.ToString());
gridView1.UpdateCurrentRow();
}));
}
呼叫 BeginInvoke
在...上 GridControl
并在那里处理一切。