1

我编写了一个执行两个任务的 C dll:

1) 将某些消息中继到 C# 程序

2) 在不同的线程上执行密集任务

一切正常,但 C# UI 没有响应,即使 C 在不同的线程上运行密集任务。

我还向 C# 公开了启动密集任务的 C 函数,允许 C# 尝试在不同的线程上运行该函数。

无论如何,当密集的任务运行时,C# 会陷入困境并且 C# 程序变得无响应。

我忘了提到我已经用 C 编写了整个程序并且它可以正常工作,但我想编写一个 C# 库以在未来的 .NET 项目中使用它。

[DllImport(@"C:\projects\math\randomout\Debug\randout.dll", CharSet = CharSet.Auto, EntryPoint = "task_ToggleTask")]
internal static extern bool task_ToggleTask();

__declspec( dllexport ) BOOL task_ToggleTask()
{
    if ( _threadStopped )
    {
        _threadStopped = FALSE;
        _t_TaskHandle = ( HANDLE )_beginthread( task_Calculate, 0, NULL );
        return TRUE;
    }
    else
    {
        _threadStopped = TRUE;
        CloseHandle( _t_TaskHandle );
        return FALSE;
    }
}

static void task_Calculate( void* params )
{

    while ( !_threadStopped )
    {

        WORD nextRestInterval = rand_GetBetween( 15, 50 );

        /*
            trivial math calculations here...
         */

        //next update is at a random interval > 0ms
        Sleep( nextRestInterval );

    }

    _endthread();

}
4

2 回答 2

0

我将尝试一个一般性的答案,因为您没有指定您正在使用哪种 C# UI 技术(WPF 或 Winforms),也没有给出您的 UI 代码的任何示例:
我认为您最好保留您的 C代码作为一个简单的实用程序库,无需尝试在那里执行任何线程操作,并让 C# 代码管理后台线程。.Net UI 有许多线程技术来保持 UI 响应,同时在后台执行一些长时间的任务,例如:Backgroundworker, Dispatcher.Invoke,Control.Invoke等等...(例如看看这个问题)。

于 2011-09-24T19:51:30.007 回答
0

您需要降低线程的优先级。我假设这发生在您的系统上,而不仅仅是程序上。如果它发生在您的程序中,您是否确定您的主应用程序线程中没有其他任何事情发生并且它实际上在单独的线程上运行?

尝试降低线程的优先级 - 请参阅: Programmatically limit CPU Usage of a Thread running inside a Service

于 2011-09-23T19:54:46.853 回答