C # Функция Осведомленность? - PullRequest
4 голосов
/ 09 февраля 2009

В многопоточном приложении. Есть ли способ программно проверить поток-B, какая функция thead-A в настоящее время?

Ответы [ 2 ]

5 голосов
/ 09 февраля 2009

Вы можете получить трассировку стека другого потока, выполнив это:

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

Отсюда вы можете получить стек вызовов и функцию, которую он выполняет в данный момент.

0 голосов
/ 22 мая 2009

Это то, что должно быть встроено в само приложение, чтобы избежать возможного конфликта между потоками.

По моему мнению, поток никогда не должен контролировать выполнение другого (например, приостановить / возобновить), за исключением запуска его. Они должны просто предложить, чтобы другой поток контролировал сам (например, с мьютексами и событиями). Это значительно упрощает управление потоками и уменьшает вероятность состязаний.

Если вы действительно хотите, чтобы поток 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 имеет пролог и эпилог-код для сохранения, установки и восстановления значений, используемых в других потоках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...