我使用下面的代码访问表单上的属性,但今天我想把东西写入ListView,这需要更多的参数。
public string TextValue
{
set
{
if (this.Memo.InvokeRequired)
{
this.Invoke((MethodInvoker)delegate
{
this.Memo.Text += value + "\n";
});
}
else
{
this.Memo.Text += value + "\n";
}
}
}
如何添加多个参数以及如何使用它们(值,值)?
答案 0 :(得分:29)
(编辑 - 我想我误解了原来的问题)
只需将其设为方法而不是属性:
public void DoSomething(string foo, int bar)
{
if (this.InvokeRequired) {
this.Invoke((MethodInvoker)delegate {
DoSomething(foo,bar);
});
return;
}
// do something with foo and bar
this.Text = foo;
Console.WriteLine(bar);
}
答案 1 :(得分:0)
通常,您可以按照以下步骤进行操作
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace Lambda1
{
public partial class Form1 : Form
{
System.Timers.Timer t = new System.Timers.Timer(1000);
Int32 c = 0;
Int32 d = 0;
Func<Int32, Int32, Int32> y;
public Form1()
{
InitializeComponent();
t.Elapsed += t_Elapsed;
t.Enabled = true;
}
void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
c = (Int32)(label1.Invoke(y = (x1, x2) =>
{ label1.Text = (x1 + x2).ToString();
x1++;
return x1; },
c,d));
d++;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
t.Enabled = false;
}
}
}
此代码的作用是:
创建计时器。经过的事件处理程序
void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
每隔1000毫秒就会调用
label1.Text将在此事件处理程序中更新。如果没有Invoke,将会发布一个线程
要使用新值更新label1.Text,请使用代码
c = (Int32)(label1.Invoke(y = (x1, x2) => { label1.Text = (x1 +
x2).ToString(); x1++; return x1; }, c,d));
请注意c和d作为参数传递给Invoke函数中的x1和x2,并且在Invoke调用中返回x1。
在此代码中插入变量d只是为了说明在调用Invoke时如何传递多个变量。