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 寻求C#线程澄清_Multithreading_Visual Studio 2010_C# 4.0 - Fatal编程技术网

Multithreading 寻求C#线程澄清

Multithreading 寻求C#线程澄清,multithreading,visual-studio-2010,c#-4.0,Multithreading,Visual Studio 2010,C# 4.0,我不熟悉穿线;事实上,我甚至没有尝试对我正在开发的Windows窗体应用程序进行多线程处理,但我对这个问题的所有搜索都将我引向了多线程处理的主题。在VisualStudio2010Express中进行调试时,使用我见过的其他人用来描述相同问题的术语似乎是“跳转”。当我让它运行时,有时它会像预期的那样运行,其他时候它似乎一直在运行,挂断了 在尝试完善我的问题时,我想我需要弄清楚: 如果计时器类在不同的线程上调用方法,并且执行代码中没有明显的不可预测的实例值/状态损坏的危险(没有对实例变量等进行任何

我不熟悉穿线;事实上,我甚至没有尝试对我正在开发的Windows窗体应用程序进行多线程处理,但我对这个问题的所有搜索都将我引向了多线程处理的主题。在VisualStudio2010Express中进行调试时,使用我见过的其他人用来描述相同问题的术语似乎是“跳转”。当我让它运行时,有时它会像预期的那样运行,其他时候它似乎一直在运行,挂断了

在尝试完善我的问题时,我想我需要弄清楚:

如果计时器类在不同的线程上调用方法,并且执行代码中没有明显的不可预测的实例值/状态损坏的危险(没有对实例变量等进行任何条件检查),为什么计时器调用的方法会表现出不可预测的行为?在我看来,代码应该同步运行,如果进程的一部分使用了不同的线程,就这样吧。我看不出哪里有线程腐败的机会

当程序启动时,它会提示设置计时器以运行数据下载过程。程序运行后,在程序结束时,计时器再次设置为默认时间。始终如一地,初始计时器设置工作正常,并按预期触发,运行数据下载过程。。。这是一种数据下载方法,在其中的某个地方出错了。最后一行代码是再次设置计时器的代码,但我无法判断在调试时它是否被击中。(跳来跳去)

我在下面添加了相关代码。。。我从一开始就进入了我代码中的每一个过程。。。它们都显示当前线程id 10。这取决于一个实例,包括计时器启动,并在下一行执行的断点处停止,这是数据下载过程。此时的当前线程:14。在运行解决方案/尝试调试之前,我已经构建了解决方案。有什么想法吗

    public partial class frmTradingAppMain : Form
        {
              private TradingAppDataRunManager drm;

              private void frmTradingAppMain_Shown(object sender, EventArgs e)
              {
                     drm = new TradingAppDataRunManager();
                     drm.StatusChanged += new DataRunManager.DRMStatusChangeHandler(UpdateFormData);
                     drm.InitializeOrScheduleDataRun();
              }

              private void UpdateFormData()
              {
                     this.Invoke(new DataRunManager.DRMStatusChangeHandler(UpdateFormDataImpl));
              }

              private void UpdateFormDataImpl()
              {
                      lblDataDwnLoadManagerStatus.Text = Convert.ToString(drm.Status);

                      if (drm.Status == DataRunManager.DRMStatus.Inactive)
                      {
                            lblNextScheduledDataDownloadDate.Text = "Date not set.";
                            lblNextScheduledDataDownloadTime.Text = "Time not set.";
                      }
                      else
                      {
                            lblNextScheduledDataDownloadDate.Text = drm.DateTimeOfNextScheduledDataRun.ToShortDateString();
                            lblNextScheduledDataDownloadTime.Text = drm.DateTimeOfNextScheduledDataRun.ToShortTimeString();
                       }
               }
        }

    public abstract class DataRunManager
    {
         protected DataRunTimer dataRuntimer;
         public delegate void DRMStatusChangeHandler();
         public event DRMStatusChangeHandler StatusChanged;
         public DRMStatusChangeHandler statusChanged;

         public void InitializeOrScheduleDataRun()
            {
                if (DataRunIsAvailable() && UserWouldLikeToPerformDataRun())
                    RunMainDataProcedure(null);
                else
                    ScheduleDataRun();
            }
         public void RunMainDataProcedure(object state)
            {
                start = DateTime.Now;
                Status = DRMStatus.Running;
                StatusChanged();
                GetDataCollections();
                foreach (DataCollection dcl in dataCollectionList)
                {
                    dcl.RunDataCollection();
                    dcl.WriteCollectionToDatabase();
                }
                PerformDBServerSideProcs();
                stop = DateTime.Now;
                WriteDataRunStartStopTimesToDB(start, stop);
                SetDataRunTimer(DateTimeOfNextAvailableDR());
            }
     public void ScheduleDataRun()
        {
            FrmSetTimer frmSetTimer = new FrmSetTimer(DateTimeOfNextAvailableDataRun);
            DateTime currentScheduledTimeOfNextDataRun = DateTimeOfNextScheduledDataRun;
            DRMStatus currentStatus= Status;

            try
            {
                frmSetTimer.ShowDialog();
                DateTimeOfNextScheduledDataRun = (DateTime)frmSetTimer.Tag;
                SetDataRunTimer(DateTimeOfNextScheduledDataRun);

            }
            catch
            {
                Status = currentStatus;
                DateTimeOfNextScheduledDataRun = currentScheduledTimeOfNextDataRun;
            }
        }
    }

public class DataRunTimer
    {
        System.Threading.Timer timer;

        public DataRunTimer(){}

        public void SetNextDataRunTime(TimerCallback timerCallback,  DateTime timeToSet)
        {
            if (timer == null)
                timer = new System.Threading.Timer(timerCallback);
            TimeSpan delayTime = new TimeSpan(timeToSet.Day - DateTime.Now.Day, timeToSet.Hour - DateTime.Now.Hour, timeToSet.Minute - DateTime.Now.Minute,
                timeToSet.Second - DateTime.Now.Second);

            TimeSpan intervalTime = new TimeSpan(0, 0, 10);
            timer.Change(delayTime, intervalTime);
        }

        public void DataRunTimerCancel()
        {
            if (timer != null)
                timer.Dispose();
        }
    }

你需要一些代码。。。这种描述毫无意义。尝试在一个最小的应用程序中一次重现一个问题。@Henk谢谢。。。我将尽可能地编辑/澄清。线程问题通常取决于代码。这意味着当你写它的时候,你忽略了一些东西。只有当我们看到代码时,我们才能看到那是什么。@BrianGideon它是System.Threading.Timer(上面添加的)的包装,thx。。