Closed. This question needs
debugging details。它当前不接受答案。
想要改善这个问题吗?更新问题,以便将其作为
on-topic用于堆栈溢出。
4年前关闭。
Improve this question
这段代码主要是图像处理,但是我遇到的不是语法错误“我们认为这是线程问题”。我正在处理未编写的应用程序。这些代码是几个.cpp/C#文件。它工作正常,但突然之间开始出现这种奇怪的行为。
通常,用户在
line 85
之前在
switch()
处拍照,然后控制进入几个功能,最后到达最后一个文件(1-> 6)。当最后一个文件(6)结束执行时,控制流回(6-> 1),我们将“
case
”检索到第一个文件,然后输入
switch()
,执行并继续。
1:
private async void measureButton_Click(object sender, RoutedEventArgs e)
{
// ..
// some code above
var result = await ((CaptureViewModel)DataContext).ProcessMeasurement(); // line 85
switch (result) // line 87 <<< Here the switch executes before line 85 finishes executing
{
// some code and cases below
// ....
2:
public async Task<AnalyzeCode> ProcessMeasurement()
{
if (currentSession.Type == SessionType.Calibration)
return await TakeCalibrationImage();
return AnalyzeCode.NoSessionSelected;
}
3:
public async Task<AnalyzeCode> TakeCalibrationImage()
{
if (calibrationData.Count < maxCalibrationImages)
{
try
{
var data = await cameraController.TakeMeasurement(currentSession.Calibration, SessionType.Calibration);
// some code below
// ..
4:
public async Task<Measurement> TakeMeasurement(Calibration calibration, SessionType type)
{
try
{
switch (type)
{
case SessionType.Calibration:
// some code above
// ..
return await cameraClient.AnalyzeNextCalibrationAsync(); // line 518 Here it throws an exception error
// some code below
//..
5:
IObservable<Measurement>^ Client::AnalyzeNextCalibrationAsync()
{
return Observable::ObserveOn(
Observable::SubscribeOn(
Observable::Create<Measurement>(
gcnew Func<IObserver<Measurement>^, Action^>(
gcnew AnalyzeNextCalibrationSubscribeFactory(this),
&AnalyzeNextCalibrationSubscribeFactory::AnalyzeNext)),
Scheduler::TaskPool),
Scheduler::TaskPool);
}
class on_next_functor_3
{
public:
void operator ()(const tuple<frame, frame>& pair) const
{
Action<Measurement>^ on_next_delegate = this->on_next_delegate;
on_next_delegate(ConvertToCalibrationMeasurement(pair));
}
};
6:
Measurement ConvertToCalibrationMeasurement(const tuple<frame, frame>& pair)
{
// ...
// more code above
auto result1 = find_calibration_pattern(master_image); // line 386
auto result2 = find_calibration_pattern(slave_image); // line 387
// ..
// some code
// ..
return Measurement( // line 401
masterImage,
slaveImage,
ConvertToDateTime(master.time),
ConvertToTargets(result));
} // end of the function
现在,这是最近的怪异行为。控件进入6并开始逐条执行语句,然后突然控件跳回4,抛出错误并一直返回到开头,并执行
switch()
,该错误将错误弹出到屏幕上。然后,控件最终返回到
line 387
并继续执行该功能。因此,从技术上讲,它会在上一条语句执行完毕之前以1的价格执行
switch()
。然后,无论最后结果如何,都将无济于事,因为我们的“失败”案例已经执行。
地球上有人知道为什么会这样吗?这个问题会在哪里产生?以及如何解决?谢谢
编辑:一旦提示错误(来自
switch()
)弹出,“输出”窗口就会显示此信息:
Exception thrown: 'System.InvalidOperationException' in System.Reactive.Linq.dll
The thread 0x1574 has exited with code 0 (0x0).
Exception thrown: 'System.NullReferenceException' in App.exe
这发生在文件4第518行的
catch()
中
“线程”窗口显示
Main Thread
从文件1-> 4一直具有控件(黄色箭头)。但是,一旦文件4调用5-> 6,则
Main Thread
失去控制,“黄色箭头”转到执行6的
Worker Thread
。现在,在执行6时,
Main Thread
将控件带回4,引发异常并执行
catch()
,但随后失去控制以返回到该
Worker Thread
并继续执行6.。这正常吗?我从来没有使用过线程,但是这是不合逻辑的,并且我从来没有见过执行某个函数后退然后前进并继续的“流程中断”。我喜欢学习的部分,但对于新手来说很困惑。