gpt4 book ai didi

c# - 尝试读取或写入 protected 内存。这通常表明其他内存已损坏

转载 作者:太空狗 更新时间:2023-10-29 20:34:42 26 4
gpt4 key购买 nike

我真的不明白这段代码怎么会出现这个错误。请自行查看代码

    void dispatcherTimer_Tick(object sender, EventArgs e)
{
string srUrl = lstLocalIndex[irLocalIndex] + lstMainIndex[irMainIndex].Replace("0;","");

Task.Factory.StartNew(() =>
{
startNewWindow(srUrl);
});

}


void startNewWindow(string srUrl)
{
NewWindowThread<TitleWindow, string>(c => new TitleWindow(c), srUrl);
}

现在这段代码是错误发生的地方。我也会附上截图

        private void NewWindowThread<T, P>(Func<P, T> constructor, P param) where T : Window
{
Thread thread = new Thread(() =>
{
T w = constructor(param);
w.Show();
w.Closed += (sender, e) => w.Dispatcher.InvokeShutdown();
try
{
System.Windows.Threading.Dispatcher.Run();
}
catch
{

}
});
thread.SetApartmentState(ApartmentState.STA);
try
{
thread.Start();
}
catch
{

}
}

这个错误导致整个软件抛出错误并停止工作,即使我在新线程中调用它们 :(

此行抛出错误 System.Windows.Threading.Dispatcher.Run();

请同时检查屏幕截图

enter image description here

C# 4.0

最佳答案

我一直在与客户解决这个问题,这是我的发现。

我们正在开发一个执行大量线程和后台工作程序处理的 WPF 应用程序。这个异常突然开始出现,我开始做一些挖掘。经过大约一个小时的调查,我终于找到了罪魁祸首:

        var worker = new BackgroundWorker();
worker.DoWork += (o, ea) => Dispatcher.BeginInvoke(new Action(() =>
{
//do some heavy processing here, plus UI work, then call another method.

//inside that other method, I found this:
var thread = new Thread(() =>
{
//do some heavy processing.
}) { IsBackground = true };
thread.Start();
}));

似乎正在发生的事情是后台工作人员正在完成其工作并从执行中返回。但是,在该后台工作线程中创建的线程未完成处理,返回时仅发现创建它的线程已经超出范围,从而导致 AccessViolationException。

为了对此进行调试,我建议密切注意异常发生的位置并仔细检查您的调用堆栈,调用堆栈可能已被破坏或丢失,也可能未被破坏或丢失,具体取决于异常发生时您是否在线程内被抛出。

关于c# - 尝试读取或写入 protected 内存。这通常表明其他内存已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9982692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com