Отношения между ManagedThreadID и операционной системой ThreadID

Изучение более высокой математики, для большинства программистов, важно просто, потому что это изгибает Ваш мозг для размышления логически пошаговым способом для получения от одной вещи до другого.

Очень немного заданий программирования, тем не менее, требуют чего-либо выше математики средней школы. Я использовал линейную алгебру однажды. Я никогда не использовал исчисление. Я использую алгебру каждый день.

7
задан Odrade 20 August 2009 в 17:05
поделиться

4 ответа

Означает ли это, что у меня нет возможности правильно вызвать CancelBlockingCall () для управляемого потока? Невозможно определить ThreadId потока уровня ОС, в котором в настоящее время выполняется управляемый поток?

Как сказал Эйдан, вы можете использовать API GetCurrentThreadID , чтобы получить идентификатор потока ОС.

] Чтобы отслеживать это в управляемых потоках, вы можете обернуть свои вызовы API в класс, в котором вы храните идентификатор потока ОС, чтобы вы могли остановить его позже:

public class APITask
{
    private uint _osThreadId;

    public void Run()
    {
        _osThreadId = GetCurrentThreadID();
        API.RunBlockingMethod();
    }

    public void Cancel()
    {
        API.CancelBlockingCall(_osThreadId);
    }
}
4
ответ дан 6 December 2019 в 09:20
поделиться

Как насчет использования Abortable ThreadPool ?

Из статьи;

Вместо этого рассмотрите реализацию пула потоков, которая вернула вам своего рода cookie для очереди рабочий элемент. Затем пул может также предоставить метод Cancel, который примет один из этих файлов cookie и отменит связанный рабочий элемент, удалив его из очереди или прервав выполнение рабочего элемента, если это необходимо. Реализация пользовательского пула потоков для этой задачи, вероятно, не лучшая идея, но есть и другие альтернативы

0
ответ дан 6 December 2019 в 09:20
поделиться

Как упоминали другие люди, вы можете попробовать p / вызвать GetCurrentThreadId , прежде чем вызывать встроенную функцию блокировки и где-то регистрировать этот идентификатор, но это бомба замедленного действия - когда-нибудь вы сможете Между двумя вызовами p / invoke поток будет предварительно освобожден и перепланирован на другой поток уровня ОС. Единственный надежный способ, который я могу предложить, - это написать крошечную неуправляемую прокси-библиотеку, которая сначала будет вызывать GetCurrentThreadId (записывая ее в out IntPtr где-нибудь, где она будет видна для управляемого кода) а затем ваша родная функция блокировки. Обратный вызов в управляемый код вместо out IntPtr также может работать; CLR вряд ли может перепланировать потоки, пока в стеке есть неуправляемые фреймы.

Изменить: , видимо, вы ' Я не первый человек, столкнувшийся с такими проблемами: в System.Threading.Thread есть два удобных метода, которые позволяют обезвредить упомянутую мною бомбу замедленного действия и вызвать GetCurrentThreadId () : Thread.BeginThreadAffinity () и Thread.EndThreadAffinity () . Хост CLR не будет повторно планировать управляемый поток в другой собственный поток между этими вызовами. Однако для вызова этих методов ваш код должен работать с высоким уровнем доверия.

14
ответ дан 6 December 2019 в 09:20
поделиться

Вы можете использовать функцию appendTo (которая добавляет в конец элемента):

$("#source").appendTo("#destination");

В качестве альтернативы вы можете использовать prependTo функция (которая добавляет к началу элемента):

$("#source").prependTo("#destination");

Пример:

 $ ("# appendTo"). click (function () {$ ("# moveMeIntoMain"). appendTo ($ ("# main" ));}); $ ("# prependTo"). click (function () {$ ("# moveMeIntoMain"). prependTo ($ ("# main"));}); 
 #main {border: 2px сплошной синий; минимальная высота: 100 пикселей; } .moveMeIntoMain {граница: 1px сплошной красный; } 
  
main < / div>
переместить меня на главную
<
2
ответ дан 6 December 2019 в 09:20
поделиться