ThreadStatic в классе powershell - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь использовать ThreadStaticAttribute в классе powershell singelton для создания нового экземпляра объекта для каждого потока, но не работает.

class log {
    [ThreadStaticAttribute()]
    static [log] $logging;
    log(){
    }
     static [log]GetInstance(){
        if($null -eq [log]::logging){
            [log]::logging=[log]::New()         
        }
        return [log]::logging
    }
}

Это возвращает тот же объект для вновь созданных потоков вместосоздание нового.Есть мысли?

1 Ответ

0 голосов
/ 09 мая 2019

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

Атрибут ThreadStatic

Атрибут [ThreadStatic] указывает, что переменная имеет один экземпляр для каждого потока.Это вариация статических переменных.

Статические переменные имеют один экземпляр на протяжении всего жизненного цикла программы.Переменная, помеченная [ThreadStatic], имеет один экземпляр на поток в программе.

Подробнее см. В примере.

class Program 
{
    public static Int32 singleton = 0;

    [ThreadStatic]

    public static Int32 threadSingleton = 0;

    static void Main(string[] args)
    {
        Program executingProgram = new Program();
        Thread firstThread = new Thread(new ThreadStart(executingProgram.FirstThread));
        Thread secondThread = new Thread(new ThreadStart(executingProgram.SecondThread));
        firstThread.Start();
        firstThread.Join();
        secondThread.Start();
        firstThread.Join(); 
        Console.Read();
    }

    public void FirstThread()
    {
        singleton++;
        threadSingleton++;
        Console.WriteLine("Singleton = {0} ThreadSingleton = {1}", singleton.ToString(), threadSingleton.ToString());
    }

    public void SecondThread()
    {
        singleton++;
        threadSingleton++;
        Console.WriteLine("Singleton = {0} ThreadSingleton = {1}", singleton.ToString(), threadSingleton.ToString());
    } 
}

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