C#功能意识?

时间:2009-02-09 18:22:15

标签: c# multithreading function

在多线程应用中。有没有办法以编程方式让线程B检查thead-A当前的功能是什么?

2 个答案:

答案 0 :(得分:5)

通过执行此操作,您可以获得另一个线程的堆栈跟踪:

System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(myThread);

从这里你可以得到调用堆栈,以及它当前正在执行的函数。

答案 1 :(得分:0)

这应该内置到应用程序本身,以避免线程之间可能的争用。

在我看来,除了启动它之外,线程永远不应该控制另一个线程的执行(例如,暂停/恢复)。他们应该只建议另一个线程控制本身(例如,使用互斥和事件)。这极大地简化了线程管理并降低了竞争条件的可能性。

如果你真的希望线程B知道A当前正在做什么线程,那么线程A应该将它传递给线程B(或任何其他线程,例如下面的主线程),例如,使用受互斥锁保护的字符串其中包含函数名称。某些东西(伪代码):

global string threadAFunc = ""
global mutex mutexA
global boolean stopA

function main:
    stopA = false
    init mutexA
    start threadA
    do until 20 minutes have passed:
        claim mutexA
        print "Thread A currently in " + threadAFunc
        release mutexA
    stopA = true
    join threadA
    return

function threadA:
    string oldThreadAFunc = threadAFunc
    claim mutexA
    threadAFunc = "threadA"
    release mutexA

    while not stopA:
        threadASub

    claim mutexA
    threadAFunc = oldThreadAFunc
    release mutexA
    return

function threadASub:
    string oldThreadAFunc = threadAFunc
    claim mutexA
    threadAFunc = "threadASub"
    release mutexA

    // Do something here.

    claim mutexA
    threadAFunc = oldThreadAFunc
    release mutexA
    return

此方法可用于支持线程的任何语言或环境,而不仅仅是.Net或C#。线程A中的每个函数都有prolog和epilog代码来保存,设置和恢复其他线程中使用的值。