【问题标题】:Delegate in multithread application多线程应用程序中的委托
【发布时间】:2013-09-05 08:57:52
【问题描述】:

我是代理新手,我想看看下面的代码是否会导致任何问题。我编写的代码没有使用共享变量,而是使用了共享委托,如下所示

       public delegate void delSaveData(string data1, string data2);
    private static delSaveData _delSaveData;
    static void Main(string[] args)
    {
        Thread td1 = new Thread(td1func);
        Thread td2 = new Thread(td2func);
        td1.Start();
        td2.Start();

    }
    private static void td1func()
    {
        while(true)
        {
            // do some operation
            _delSaveData= new delSaveData(SaveData);
            _delSaveData("someValueFromtd1", "someValueFromtd1");
        }
    }
    private static void td2func()
    {
        while(true)
        {
            // do some operation
            _delSaveData= new delSaveData(SaveData);
            _delSaveData("someValueFromtd2", "someValueFromtd2");
        }
    }
    private static void SaveData(string test1, string test2)
    {
        //Save Data in database
    }

我假设代码应该可以正常工作,因为每次都会创建一个新的委托实例。我对吗? 如果创建的委托实例之一出现问题,会影响其他实例吗?

提前感谢您的回答,

【问题讨论】:

  • 你说得对,但是这里为什么需要委托,你可以直接打电话给SaveData。
  • 你好,这只是对我理解委托的一个测试,我当然可以直接调用函数。

标签: c# multithreading winforms delegates


【解决方案1】:

首先,您没有修改(添加或删除)要委托的处理程序。那么为什么要一直创造新的呢?

试试下面的

private static readonly delSaveData _delSaveData = new delSaveData(SaveData);

这应该没问题。您可以在任意数量的线程中使用它。

如果出现问题怎么办?

出了什么问题?不知道你的意思。

【讨论】:

    【解决方案2】:

    我假设代码应该可以正常工作,因为每次都会创建一个新的委托实例。我说的对吗?

    您是否尝试过运行代码,也就是您尝试过什么? 我看不出有什么直接的问题。

    我可以告诉你:如果从任一线程抛出异常(实例化或执行委托时可能发生的问题),它将无法处理。 一个线程中的异常不会影响另一个线程。所以不,如果“出现问题”,它不会影响另一个实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多