外部函数返回值时如何暂停线程? (C#)

时间:2011-07-20 11:06:00

标签: c# multithreading

有一个外部库,其函数返回一个具有一定延迟的值(休眠200-1000ms),C ++代码:

__declspec( dllexport ) 
char ReadNextChar()
{
    char OneChar[2];
    while (Receive((char*)&OneChar)==-1) {Sleep(200);}

    return OneChar[0];
}

在主程序运行线程中, C#代码:

public void Start()
    {
        thread = new Thread(ReadChar);
        thread.IsBackground = true;
        thread.Priority = ThreadPriority.BelowNormal;

        thread.Start()
    }

    char currentChar;

    [DllImport("reader.dll")]
    public extern char ReadNextChar();       

    private void ReadChar()
    {
        while(true) {
            currentChar=ReadNextChar();
        }            
    }

在我看来,这可以得到认真优化。执行此任务的最佳方法是什么? (外部函数睡眠时它是如何工作的?)。感谢。

3 个答案:

答案 0 :(得分:1)

在win32上执行此操作的典型方法是使用事件并从ReadNextChar函数发出此事件的信号。 这是使用重叠模式(http://msdn.microsoft.com/en-us/library/aa365467(v=vs.85).aspx

时Win32 ReadFile函数的工作方式

然后,您可以使用WaitForSingleObject将线程置于休眠状态。当事件发出信号时,它将再次运行。

这会使您的实现更复杂,并且还需要修改dll。现在,如果您正在进行的读取实际上可以等待,那么真的值得这样做 - 否则您将最终必须在您的dll中添加另一个线程来轮询和设置事件(如果您是这样做是为了优化目的,因为这将是一个悲观的优化,至少可以说。

老实说,由于您可能至少睡了200毫秒,因此轮询读取功能不太可能导致任何重大性能问题 - 请不要为此进行优化。

显然,你的代码没有做的事情就是让线程退出而不终止()。我个人会把睡眠放在c#代码中,并从ReadNextChar函数返回一个读取成功代码,而不会在循环中旋转或在那里有任何睡眠。我希望你的代码只是一个例子..

答案 1 :(得分:0)

您的外部函数在同一个线程上执行,因此在等待时无法“停止”。

你已经在一个帖子中运行ReadChar,这就是在外部代码中调用sleep时睡眠的确切步骤。

答案 2 :(得分:0)

假设您的意思是“如果在非托管睡眠方法中,如何阻止线程运行?”那么答案就是你不能 - 至少没有调用你真正不应该做的TerminateThread

但是,您可以在代码返回托管代码时通过检查while中的标志而不是使用while(true)来结束

或者当你的进程以后台线程结束时线程将结束