Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何使用侦听和发送数据的进程设计多线程.NET应用程序?_Multithreading_C# 4.0 - Fatal编程技术网

Multithreading 如何使用侦听和发送数据的进程设计多线程.NET应用程序?

Multithreading 如何使用侦听和发送数据的进程设计多线程.NET应用程序?,multithreading,c#-4.0,Multithreading,C# 4.0,我正在尝试设计一个多线程的.NET应用程序,它可以同时执行多个进程。我没有使用多线程应用程序的经验,过去几天我一直在阅读它。这是我需要做的。我将有两个进程在某个时间间隔“侦听”UDP广播数据。然后我将有第三个进程,在某个时间间隔发送最新的数据。现在我正在构建一个概念验证应用程序。我正在将其构建为一个C#WinForms应用程序。我的想法是使用一个类实例来保存最新的数据,并使用锁定来确保没有任何问题 我的申请很有效。它似乎运行了大约60秒,然后就停止工作了。它并不是真的因为一个错误或任何事情而失败

我正在尝试设计一个多线程的.NET应用程序,它可以同时执行多个进程。我没有使用多线程应用程序的经验,过去几天我一直在阅读它。这是我需要做的。我将有两个进程在某个时间间隔“侦听”UDP广播数据。然后我将有第三个进程,在某个时间间隔发送最新的数据。现在我正在构建一个概念验证应用程序。我正在将其构建为一个C#WinForms应用程序。我的想法是使用一个类实例来保存最新的数据,并使用锁定来确保没有任何问题

我的申请很有效。它似乎运行了大约60秒,然后就停止工作了。它并不是真的因为一个错误或任何事情而失败。有时它似乎只是停止发送。其他时候,应用程序将在没有任何错误的情况下关闭。让我觉得我遇到了多线程同步问题或其他问题

下面是一些简化的代码:

public class MyData
{
  public string Field1 {get; set;}
  public string Field2 {get; set;}
}

public class myForm : Form
{
  private MyData _data = new MyData();
  readonly object _locker = new object();
  Thread _thread1;
  Thread _thread2;
  Thread _thread3;

  public myForm()
  {
    _thread1 = new Thread(new ThreadStart(Listener1));
    _thread2 = new Thread(new ThreadStart(Listener2));
    _thread3 = new Thread(new ThreadStart(Sender));

    _thread1.Start();
    _thread2.Start();
    _thread3.Start();
  }

  private void Listener1()
  {
    bool _done = false;
    while (!_done)
    {
      ...listen and get data...
      lock(_locker)
      {
        _data.Field1 = ...value...
      }
    }
  }

  private void Listener2()
  {
    bool _done = false;
    while (!_done)
    {
      ...listen and get data...
      lock(_locker)
      {
        _data.Field2 = ...value...
      }
    }
  }

  private void Sender()
  {
    string _dataToSend = "";
    bool _done = false;
    while(!_done)
    {
      Thread.Sleep(2000);
      lock(_locker)
      {
        _dataToSend = _data.Field1 + "," + _data.Field2;
      }
    }
    ...send _dataToSend...
  }
}
有人知道我做错了什么吗?这个概念正确吗?有没有更好的方法可以让我完成同样的事情?与其使用类变量来保存数据(MyData),不如从不同的线程在文件系统上读/写一个文件

谢谢, 科里


编辑:我省略了启动线程的代码。

1。使用任务而不是线程。2.您是否将数据绑定到任何控件?如果是这样,这将不起作用,因为UI是从另一个线程更新的。不,我没有将任何数据绑定到应用程序中的任何控件。另外,你知道我在哪里可以学到更多关于任务的知识吗?我在谷歌上搜索了一下,但是我找不到一个好的教程来解释任务。比如在这里搜索“TPL”,好吧,我读了一些关于TPL的文章。那有点帮助。但我仍然找不到任何具体的例子。我想知道如何编写3个长时间运行的方法,这些方法将同时运行,并且都需要修改共享对象。请将代码更改为tasks,并编写完整代码,而不仅仅是psuedo代码。