簡體   English   中英

如何在一組線程之間共享執行上下文?

[英]How can I shared a execution context between a group of threads?

在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>();
    }
}

你可以這樣做:

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);
    }    
}

但是您始終需要記住不同的線程可以同時對共享對象進行操作,因此,如果要使用線程可以修改的對象,則必須記住同步

您可以使用靜態方法,但請確保應用單例模式,或以任何方式保存並發問題

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM