가 나는 다음과 같은 무언가가 어디에서 일하고 있어요 배경 스레드에서 인스턴스를 주입 액세스 백그라운드 스레드 (Task.Run) 및 Bar
은 싱글 톤 라이프 스타일을 사용하여 응용 프로그램의 Main 메서드 (Windows form app)에 등록됩니다. 내가 가진 걱정은 Foo
에 제공된 Bar
의 구현이 스레드로부터 안전하지 않은 경우입니다.간단한 인젝터 내가 응용 프로그램 내에서 SimpleInjector을 사용하고
내가 가지고있는 주된 문제는 Foo
에 의해 필요로하는 상태 인 Bar
이며,이 상태는 전에 Foo.DoSomething
이 호출되기 전에 주 스레드에 의해 설정됩니다. 나는 내가 직면하고있는이 상황에 대한 해결책을 찾아 보았지만, 도움이되는 사람을 찾을 수 없었다. (나는 이것에 대해 잘못된 방향으로 가고 있지 않다면).
백그라운드 스레드에서 인스턴스가 실행될 때 데코레이터를 사용하는 this 페이지의 제안을 살펴 보았습니다. 그러나 Bar
의 상태가 다른 스레드 (주 스레드)에 설정되어 있고 데코레이터를 사용하면 상태가없는 Bar
의 새 인스턴스가 작성되므로 도움이되지 않습니다.
그래서 내 질문에 바를 싱글 톤으로 등록해야하고 등록 된 구현이 스레드로부터 안전한지 확인해야한다. 그렇지 않으면이 문제에 대한 명백한 해결책이있다. 나는 볼 수 없습니까?
희망 정보는 충분합니다. 더 자세한 정보가 필요하면 알려주세요.
감사
업데이트 Bar
는 단순히 응용 프로그램은 전체에 필요 정보의 목록을 유지하는 클래스입니다. 예를 들어 : 마침내 여기
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>());
}
바 및 주 관련 코드를 표시하십시오. – Steven
@Steven 더 많은 정보를 포함하도록 질문을 수정했습니다. 희망이 도움이됩니다. 감사합니다 –