我的應用程序中使用SimpleInjector我的工作,在那裏我有類似以下的東西:簡單的注射器 - 訪問來自後臺線程注入的情況下
public class Foo : IFoo
{
private readonly Bar _bar;
public Foo(Bar bar)
{
_bar = bar;
}
public void DoSomething()
{
IEnumberable<Order> orders = _bar.Orders;
}
}
我的行爲是Foo.DoSomething
被稱爲從後臺線程(Task.Run)和Bar
註冊在應用程序的主要方法(Windows窗體應用程序)與單身生活方式。我所關心的是如果Bar
提供給Foo
的實現不是線程安全的。
我的主要問題是Bar
的狀態是Foo
所需要的,這個狀態是在調用Foo.DoSomething
之前由主線程設置的。我已經四處尋找解決方案,我面臨的這種情況,但我無法找到一個幫助(除非我只是走錯了方向)。
我看過this頁面上的建議,在後臺線程上執行實例時使用裝飾器。然而,這並沒有幫助,因爲Bar
的狀態設置在不同的線程(主線程)上,並且使用裝飾器將只創建一個沒有狀態的新實例Bar
。
所以我想我的問題是我只需要註冊酒吧作爲一個單身人士,並確保註冊的實現是線程安全的,或者是有明顯的解決方案,這個問題,正在盯着我在臉上但我似乎無法看到?
希望我提供的信息是足夠的。如果您需要更多信息,請告訴我。
感謝
更新 Bar
只是包含信息的列表類在整個應用程序的需要。例如:
public class Bar: IBar
{
// Not using orders or products, but just for purpose of the example
// These are initialized early on in the App process because early
// steps of the app (which are on the main thread) need them.
public IEnumerable<Order> Orders { get; private set; }
public IEnumerable<Product> Products { get; private set; }
}
以下是我使用美孚形式應用:
public partial class App: Form
{
private readonly IFoo _foo;
public App(IFoo foo)
{
InitializeComponent();
_foo = foo;
}
public btn1_Click()
{
// This is just for the purpose of showing that the data inside Bar
// is loaded on the main thread before Foo.DoSomething is run. In
// the real app the Bar data is loaded at previous steps of the app
// (the app is a wizard like app).
LoadBarData();
Task.Run(() =>
{
_foo.DoSomething();
});
// The issue would be if for example Bar is changed here while the
// background thread is running. In my app it doesn't really change
// here, but I want to make sure no issues arise in all scenarios,
// whether it changes or not.
}
}
最後這裏是我的主要方法:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
using (Container container = new Container())
{
container.Register<IBar, Bar>(Lifestyle.Singleton);
container.Register<IFoo, Foo>(Lifestyle.Singleton);
container.Register<App>();
}
Application.Run(container.GetInstance<App>());
}
請顯示Bar和Main的相關代碼。 – Steven
@Steven我編輯了這個問題以包含更多信息。希望能幫助到你。謝謝 –