Как я могу разделить контекст выполнения между группами потоков? - PullRequest
0 голосов
/ 13 марта 2019

В методе Foo я создаю какую-то задачу и хочу установить контекст в главном потоке и получить к нему доступ из других потоков, есть ли способ разделить контекст между моим основным потоком и другими потоками, кроме созданного в основном нить? Я не хочу передавать контекст другим потокам, и я предпочитаю устанавливать контекст в одной точке, как в пользовательском образе жизни в контейнере IOC для контекста выполнения

public class IUserContext
{
    string UserName {get;}
    string Token {get;}
}

public void Foo()
{//I set the context data before calling the method
    foreach(...) {
        Task.Factory.StartNew(() =>method1);
    }

    void method1()
    {
         // context is null
         var context = Container.Resolve<IUserContext>();
    }
}

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Вы можете использовать Статический метод, но не забудьте применить одноэлементный шаблон или сохранить проблему параллелизма любым способом

public static void Foo()
{   
   //Singleton start
   private static ReadOnly Foo instance;
   private Foo() {}

   public static Foo Instance
   {
        get{
          if(instance == null){
             instance = new Foo();
             }
             return instance;
             }
   }
   //Singleton end

   public static void method1()
   {
        // context is null
        var context = Container.Resolve<IUserContext>();
   }
}

Затем вы можете вызывать этот метод внутри каждой задачи

взгляните на одиночный экземпляр https://codeburst.io/singleton-design-pattern-implementation-in-c-62a8daf3d115

0 голосов
/ 13 марта 2019

Вы можете сделать это так:

public class IUserContext
{
    public string  UserName 
    {
        get
        {
            return "user";
        }
    }
    public string Token 
    {
        get
        {
            return "token";
        }
    }
}

public class Program
{
    public static IUserContext context = new IUserContext();

    public static void Main()
    {

        for(int i = 0; i < 4; i++) 
        {            
            Task.Factory.StartNew(() => method1());
        }
    }

    public static void method1()
    {
        Console.WriteLine("I'm task #" + Task.CurrentId + " and I work with user " + context.UserName + " that have token " + context.Token);
    }    
}

Но вы всегда должны помнить о том, что разные потоки могут работать с общими объектами одновременно, поэтому, если вы хотите использовать объекты, которые потоки могут изменять, вы должны помнить о синхронизации

...