我的 C# 程式中有多個執行緒。現在他們在運行時不時呼叫一個特定的函式。現在我想確保它們永遠不會同時執行那個特定的函式(因為它會導致我的程式出現一些例外),對該函式的一次呼叫必須在下一次呼叫開始之前完成。(很像佇列)。
有沒有可能做到這一點?(不具備成為一個功能)。
如果有些人看不懂,請看下面的圖表:

uj5u.com熱心網友回復:
您可以使用lock關鍵字來阻止并行執行代碼片段。只需將您的函式呼叫包裝到一個 lock 陳述句中或在函式本身內添加一個鎖。
class MyClass
{
private object lockObj = new();
public void MyFunction()
{
lock(lockObj)
{
//code goes here
}
}
}
//usage
void Test()
{
var myClass = new MyClass();
var thread1 = new Thread(ThreadFunc);
var thread2 = new Thread(ThreadFunc);
thread1.Start(myClass);
thread2.Start(myClass);
}
public static void ThreadFunc(object myClassObj)
{
var myClass = (MyClass)myClassObj;
myClass.MyFunction();
}
注意lockObj這里的物件。為了實作您想要的行為,您應該lockObj在lock陳述句中使用完全相同的值。所以,以下是錯誤的
//WRONG, do NOT DO this
var myClass1 = new MyClass();
var myClass2 = new MyClass();
var thread1 = new Thread(ThreadFunc);
var thread2 = new Thread(ThreadFunc);
thread1.Start(myClass1);
thread2.Start(myClass2);
這里我們有兩個獨立的實體MyClass,所以每個實體都有自己的值,lockObj因此這個實體不會相互鎖定,所以這里允許并行執行myClass1.MyFunction()和myClass2.MyFunction()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/362522.html
