Multithreading 寻求C#线程澄清
我不熟悉穿线;事实上,我甚至没有尝试对我正在开发的Windows窗体应用程序进行多线程处理,但我对这个问题的所有搜索都将我引向了多线程处理的主题。在VisualStudio2010Express中进行调试时,使用我见过的其他人用来描述相同问题的术语似乎是“跳转”。当我让它运行时,有时它会像预期的那样运行,其他时候它似乎一直在运行,挂断了 在尝试完善我的问题时,我想我需要弄清楚: 如果计时器类在不同的线程上调用方法,并且执行代码中没有明显的不可预测的实例值/状态损坏的危险(没有对实例变量等进行任何条件检查),为什么计时器调用的方法会表现出不可预测的行为?在我看来,代码应该同步运行,如果进程的一部分使用了不同的线程,就这样吧。我看不出哪里有线程腐败的机会 当程序启动时,它会提示设置计时器以运行数据下载过程。程序运行后,在程序结束时,计时器再次设置为默认时间。始终如一地,初始计时器设置工作正常,并按预期触发,运行数据下载过程。。。这是一种数据下载方法,在其中的某个地方出错了。最后一行代码是再次设置计时器的代码,但我无法判断在调试时它是否被击中。(跳来跳去) 我在下面添加了相关代码。。。我从一开始就进入了我代码中的每一个过程。。。它们都显示当前线程id 10。这取决于一个实例,包括计时器启动,并在下一行执行的断点处停止,这是数据下载过程。此时的当前线程:14。在运行解决方案/尝试调试之前,我已经构建了解决方案。有什么想法吗Multithreading 寻求C#线程澄清,multithreading,visual-studio-2010,c#-4.0,Multithreading,Visual Studio 2010,C# 4.0,我不熟悉穿线;事实上,我甚至没有尝试对我正在开发的Windows窗体应用程序进行多线程处理,但我对这个问题的所有搜索都将我引向了多线程处理的主题。在VisualStudio2010Express中进行调试时,使用我见过的其他人用来描述相同问题的术语似乎是“跳转”。当我让它运行时,有时它会像预期的那样运行,其他时候它似乎一直在运行,挂断了 在尝试完善我的问题时,我想我需要弄清楚: 如果计时器类在不同的线程上调用方法,并且执行代码中没有明显的不可预测的实例值/状态损坏的危险(没有对实例变量等进行任何
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。。