【问题标题】:Delegates and setting labels代表和设置标签
【发布时间】:2015-04-23 17:10:33
【问题描述】:

因此,我对这段代码的总体目标是从不同的线程(以安全的方式)设置标签的文本属性。

namespace csDinger3
{
    public delegate void setlblStarted_txt(string text);

    public partial class ClientUI : Form
    {
        public void setlblStarted_txt(string text)
        {
            var setlblStarted a = new setlblStarted(setlblStarted_txt);
            if (this.lblStarted.InvokeRequired)
            {
                this.Invoke(a, new object[] { text });
            }
            else
            {
                this.lblStarted.Text = text;
            }
        }
    }
}

调用代码:

namespace csDinger3
{
    public class Program
    {
        // Some code that's not relevant
        public static void updateText(Int32 number)
        {
            setlblStarted x = new setlblStarted(ClientUI.setlblStarted_txt);
            x(number.ToString());
        }
    }
}

据我所知(如果我错了,请纠正我),我需要创建一个setlblStarted_txt 的新实例,将该新实例指向方法setlblStarted_txt,但问题目前是ClientUI.setlblStarted_txt不是静态的,并且需要对象引用。

我尝试过使用ClientUI c = new ClientUI();,但这不起作用(因为它正在创建表单的新实例?)

我做错了什么,如果可能的话,你能帮我理解为什么吗?

【问题讨论】:

  • 你想达到什么目的?在 .NET 4.0 中,大多数时候不需要声明委托。
  • 为什么要把这段代码放在Program 类中?它是启动应用程序的那个。你应该把它放在 WinForms 类的代码隐藏中。
  • @Cameron 我把它用作中心类,但我想我可以很容易地改变它

标签: c# .net multithreading winforms


【解决方案1】:

在 .Net 4.0 中,您可以使用操作:

if (InvokeRequired)
{
     Invoke(new Action<string>(updateText), "some text");
}
else
{
     updateText("some text");
}

另外,void updateText(string text) 不需要是静态的。

【讨论】:

  • @harismranb updateText 在不同的线程上,我需要调用方法setlblEarned_txt。我可以将updateText 替换为setlblEarned_txt 吗?
【解决方案2】:

据我了解,您正在尝试使用 MethodInvoker 委托来更新您的文本。我建议你改变这种方法来简化你的代码:

namespace csDinger3
{
    public class Program
    {
        static ClientUI aForm;

        static void Main()
        {
             aForm = new ClientUI();
             aForm.Show();
        }
        // Some code that's not relevant
        public static void updateText(Int32 number)
        {
            aForm.setlblStarted_txt(number.ToString());
        }

public partial class ClientUI : Form
{
    public void setlblStarted_txt(string text)
    {
        if (lblStarted.InvokeRequired)
        {
            Invoke(new EventHandler(delegate
            {
                lblStarted.Text = text
            }));
        }
        else
        {
            lblStarted.Text = text;
        }
    }

您可以使用 ThreadPoolSynchronizationContextDispatcher(在 WPF 中)实现相同的行为。请参阅本教程以获得更好的理解:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-12
    • 2011-08-05
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    相关资源
    最近更新 更多