2016-04-05 28 views
3

基本上,我很好奇,如果有什麼事情會使以下事情發生。是否有任何等同於訪問修飾符的限制只能使用C#訪問一個線程?

class MyClass 
{ 
    public void MyMethod() { } 

    public void MyNonThreadMethod() { } 
} 

public void OtherThread(MyClass myObject) 
{ 
    Thread thread = new Thread(myObject.MyMethod); 
    thread.Start(); // works 

    thread = new Thread(myObject.MyNonThreadMethod); 
    thread.Start(); // does not work 
} 

問候,安東

+2

'[MethodImpl(MethodImplOptions.Synchronized)]' – Eser

+1

@Eser謝謝! – Anton

+0

您可以使用像waitone這樣的信號量:https://msdn.microsoft.com/en-us/library/cc189907(v=vs.110).aspx – jdweng

回答

3

從你的榜樣,我想你需要實現只能在一個指定的線程執行的方法。爲了達到這個目的,你可以使用一個線程靜態字段來標識指定的線程 - 例如,通過從構造函數中設置一個標誌。

class MyClass 
{ 
    [ThreadStatic] 
    bool isInitialThread; 

    public MyClass() 
    { 
     isInitialThread = true; 
    } 

    public void MyMethod() { } 

    public void MyNonThreadMethod() 
    { 
     if (!isInitialThread) 
      throw new InvalidOperationException("Cross-thread exception."); 
    } 
} 

不要使用ManagedThreadId用於此目的 - 看Managed Thread Ids – Unique Id’s that aren’t Unique