gpt4 book ai didi

c# - BackgroundWorker DoWork 线程的堆栈大小是多少?有办法改变吗?

转载 作者:太空宇宙 更新时间:2023-11-03 14:41:50 27 4
gpt4 key购买 nike

我知道 C# 主程序的堆栈大小为 1 MB(32 位和任何)或 4 MB(64 位),请参阅 Why is stack size in C# exactly 1 MB?

BackgroundWorker DoWork 线程的默认堆栈大小是多少?

有没有一种方法可以改变 BackgroundWorker DoWork 线程的堆栈大小,同时创建另一个线程,如下例所示:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
Thread thread = new Thread(delegate()
{
// do work with larger stack size
}, 8192 * 1024);
thread.Start();
thread.Join();
}

我正在使用 BackgroundWorker,因为我有一个 Windows Forms 应用程序,我在其中的 DoWork 事件中进行一些计算。我这样做是因为我想向 GUI 的状态行报告,并且我希望用户可以取消计算。

我收到堆栈溢出错误,因为我正在调用英特尔 MKLs LAPACKE_dtrtri这是高度递归的,参见 http://www.netlib.org/lapack/explore-html/df/d5c/lapacke__dtrtri_8c_source.html .

以下代码展示了我如何调用 Intel MKL:

public static double[,] InvTriangularMatrix(double[,] a, bool isupper)
{
int n1 = a.GetLength(0);
int n2 = a.GetLength(1);
if (n1 != n2) throw new System.Exception("Matrix must be square");
double[,] b = Copy(a);
int matrix_layout = 101; // row-major arrays
char uplo = isupper ? 'U' : 'L';
char diag = 'N';
int lda = Math.Max(1, n1);
int info = _mkl.LAPACKE_dtrtri(matrix_layout, uplo, diag, n1, b, lda);
if (info > 0) throw new System.Exception("The " + info + "-th diagonal element of A is zero, A is singular, and the inversion could not be completed");
if (info < 0) throw new System.Exception("Parameter " + (-info) + " had an illegal value");
return b;
}

[DllImport(DLLName, CallingConvention = CallingConvention.Cdecl, ExactSpelling = true, SetLastError = false)]
internal static extern int LAPACKE_dtrtri(
int matrix_layout, char uplo, char diag, lapack_int n, [In, Out] double[,] a, int lda);

InvTriangularMatrix 在我的 DoWork 事件中调用。当我没有设置堆栈大小时,我在 LAPACKE_dtrtri 函数中遇到堆栈溢出错误。

矩阵的大小可以在 1000 x 1000 到 100000 x 100000 之间。如果矩阵大于 65535 x 65535,请参阅 2d-Array with more than 65535^2 elements --> Array dimensions exceeded supported range .

最佳答案

BackgroundWorker DoWork 事件中的堆栈大小与主线程相同。

教授:

例如,将构建后事件中的堆栈大小设置为 8 MB:

"$(DevEnvDir)..\..\VC\bin\editbin.exe" /STACK:8388608 "$(TargetPath)"

然后使用以下代码请求堆栈大小:

[DllImport("kernel32.dll")]
internal static extern void GetCurrentThreadStackLimits(out uint lowLimit, out uint highLimit);


public static uint GetStackSize()
{
uint low, high;
GetCurrentThreadStackLimits(out low, out high);
return high - low;
}

在主程序和 DoWork 事件中使用 GetStackSize 在这两种情况下都会返回 8 MB 或您使用 EDITBIN/STACK 指定的任何内容。

关于c# - BackgroundWorker DoWork 线程的堆栈大小是多少?有办法改变吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56457637/

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