C#如何使用多个参数调用

时间:2009-04-08 10:47:04

标签: c# winforms invoke

我使用下面的代码访问表单上的属性,但今天我想把东西写入ListView,这需要更多的参数。

    public string TextValue
    {
        set
        {
            if (this.Memo.InvokeRequired)
            {
                this.Invoke((MethodInvoker)delegate
                {
                    this.Memo.Text += value + "\n";
                });
            }
            else
            {
                this.Memo.Text += value + "\n";
            }
        }
    }

如何添加多个参数以及如何使用它们(值,值)?

2 个答案:

答案 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)

通常,您可以按照以下步骤进行操作

  • 在C#2012 / Net 4.5中创建名为Lambda1的Windows窗体应用程序项目
  • 在Form1表单中,插入名为label1
  • 的标签
  • 按F4打开Form1属性(而不是label1属性)
  • 点击“事件”视图(带有雷声的图标)
  • 双击Form Closing事件。将创建一个事件处理程序。
  • 现在不介意事件处理程序。稍后将被另一个替换;
  • 选择并删除Form.cs中的所有代码(Ctrl-A / Delete键)
  • 将以下代码复制并粘贴到Form1.cs;
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时如何传递多个变量。