내가 꺼져 있거나 완전히 닫혀있을 수 있습니다. 어느 쪽이든, 저는 현재 SOL입니다. :)C# 스레드 안전 확장 메서드
클래스의 속성을 설정하기 위해 확장 메서드를 사용할 수 있지만 해당 클래스가 비 UI 스레드에서 업데이트되거나 업데이트되지 않도록 할 수 있고 업데이트를 적용하는 클래스에서 파생됩니다. UI 스레드 (INotifyPropertyChanged 등을 구현)에 있어야합니다. 나는이 같은 확장 메서드 클래스 정의 뭔가가
public class ClassToUpdate : UIObservableItem
{
private readonly Dispatcher mDispatcher = Dispatcher.CurrentDispatcher;
private Boolean mPropertyToUpdate = false;
public ClassToUpdate() : base()
{
}
public Dispatcher Dispatcher
{
get { return mDispatcher; }
}
public Boolean PropertyToUpdate
{
get { return mPropertyToUpdate; }
set { SetValue("PropertyToUpdate", ref mPropertyToUpdate, value; }
}
}
:
나는이 같은 클래스 정의 뭔가를 분명히
static class ExtensionMethods
{
public static IEnumerable<T> SetMyProperty<T>(this IEnumerable<T> sourceList,
Boolean newValue)
{
ClassToUpdate firstClass = sourceList.FirstOrDefault() as ClassToUpdate;
if (firstClass.Dispatcher.Thread.ManagedThreadId !=
System.Threading.Thread.CurrentThread.ManagedThreadId)
{
// WHAT GOES HERE?
}
else
{
foreach (var classToUpdate in sourceList)
{
(classToUpdate as ClassToUpdate).PropertyToUpdate = newValue;
yield return classToUpdate;
}
}
}
}
을, 나는이 "무엇을 간다 찾고 있어요 "확장 메소드에서.
감사합니다, WTS
당신은 'SetMyProperty'라는 열거 있나요? 어쩌면이 함수가 실제로 무엇을해야 하는지를 먼저 결정해야합니다. –
@Henk : 실제로, 나는 유창한 API라고 생각한다 :'sourceList.SetMyProperty (true) .SetMyOtherProperty ("hello"). SetFoo (42) ...' –
확장 메소드는 정적 메소드보다 아무것도 알 수 없다. '장식'하는 값 (이 작업은 컴파일 타임에 전체적으로 수행됩니다). 스레드 안전은 스레드가 수행하는 작업과 관련하여 어떤 상황에서 발생 하는지를 나타냅니다. 그러나, 그렇지 않으면 그들에 관하여 특별한 것이 없습니다. 스레딩. 일반적으로 SynchronizationContext와 디스패처를 사용하고 싶습니다. –