多线程:运行C dll的C#程序 - 无响应的C#

时间:2011-09-23 19:49:24

标签: c# c multithreading dll ui-thread

我写了一个执行两项任务的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();

}

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我将尝试一般性答案,因为您尚未指定您正在使用的哪种C#UI技术(WPF或Winforms),并且未提供任何UI代码示例:
我认为你最好将你的C代码保存为一个简单的实用程序库,而不是尝试在那里做任何线程,并让C#代码管理后台线程。 .Net UI具有许多线程技术,可以在后台执行一些长任务时保持UI响应,例如:BackgroundworkerDispatcher.InvokeControl.Invoke等...(请查看{例如{3}}。