เมื่อเร็ว ๆ นี้ฉันกำลังทำงานกับ ConsoleApp สำหรับการกำหนดเวลางาน บทความนี้จะไม่กล่าวถึงส่วนการจัดกำหนดการงานในตอนนี้ (ฉันจะเขียนเกี่ยวกับเรื่องนี้ในภายหลัง) บทความนี้จะกล่าวถึงวิธีการตรวจสอบการทำงานของอินสแตนซ์เดียวเท่านั้น
ข้อกำหนดการรัน ConsoleApp
1. เริ่มแอปพลิเคชันเมื่อระบบเริ่มทำงาน
2. อินสแตนซ์เดียวที่ทำงานในแต่ละเซสชัน
เมื่อเปิดลิงก์เดสก์ท็อประยะไกล อนุญาตให้เริ่มต้น ConsoleApp ได้เพียงอินสแตนซ์เดียวเท่านั้น
3. สามารถรันภายในระบบได้เพียงอินสแตนซ์เดียวเท่านั้น
เมื่อเปิดลิงก์เดสก์ท็อประยะไกลหลายลิงก์ จะอนุญาตให้เริ่ม ConsoleApp ได้เพียงอินสแตนซ์เดียวเท่านั้น
มูเท็กซ์
Mutex: การซิงโครไนซ์แบบดั้งเดิมที่สามารถใช้สำหรับการซิงโครไนซ์ระหว่างกระบวนการได้
MSND ที่มองเห็นได้: http://msdn.microsoft.com/zh-cn/library/system.threading.mutex.aspx
ในการแนะนำเอกสารราชการมีวรรคนี้
บนเซิร์ฟเวอร์ที่เรียกใช้บริการเทอร์มินัล mutex ของระบบที่มีชื่อสามารถมีการมองเห็นได้สองระดับ หากชื่อขึ้นต้นด้วยคำนำหน้า "Global" mutex จะมองเห็นได้ในเซสชันเทอร์มินัลเซิร์ฟเวอร์ทั้งหมด หากชื่อขึ้นต้นด้วยคำนำหน้า "Local" mutex จะมองเห็นได้เฉพาะในเซสชันเทอร์มินัลเซิร์ฟเวอร์ที่ถูกสร้างขึ้นเท่านั้น ในกรณีนี้ คุณสามารถมี mutex แยกต่างหากที่มีชื่อเดียวกันในทุกเซสชันของเทอร์มินัลเซิร์ฟเวอร์อื่นๆ บนเซิร์ฟเวอร์ หาก mutex ที่มีชื่อถูกสร้างขึ้นโดยไม่ระบุคำนำหน้า จะใช้คำนำหน้า "Local" ในเซสชันเทอร์มินัลเซิร์ฟเวอร์ mutexes สองตัวที่แตกต่างกันเฉพาะคำนำหน้าชื่อคือ mutexes อิสระ และ mutexes ทั้งสองนี้จะมองเห็นได้สำหรับกระบวนการทั้งหมดในเซสชันเทอร์มินัลเซิร์ฟเวอร์ นั่นคือ: ชื่อคำนำหน้า "Global" และ "Local" ระบุขอบเขตของชื่อ mutex ที่สัมพันธ์กับเซสชันเทอร์มินัลเซิร์ฟเวอร์ (ไม่เกี่ยวข้องกับกระบวนการ)
น่าเสียดายที่ไม่พบตัวอย่าง C# ข้อความนี้สามารถเข้าใจได้เป็น:
mutexName= "ท้องถิ่น\" + "ชื่อแอป";
ใช้ได้เฉพาะกับเซสชันที่สร้างขึ้นเท่านั้น ซึ่งหมายความว่าเมื่อมีการเปิดการเชื่อมต่อระยะไกลใหม่ อินสแตนซ์ ConsoleApp จะเริ่มต้นอีกครั้ง
mutexName= "ทั่วโลก\" + "ชื่อแอป";
ใช้ได้กับทุกเซสชัน เมื่อเปิดลิงก์ระยะไกลหลายรายการ เฉพาะลิงก์ระยะไกลแรกเท่านั้นที่จะเริ่มต้นอินสแตนซ์ ConsoleApp ได้สำเร็จ
ทำงานเป็นอินสแตนซ์เดียวต่อเซสชัน
โมฆะคงที่ส่วนตัว LocalMutex ()
-
// ไม่ว่าจะสร้าง mutex เป็นครั้งแรกหรือไม่
บูล newMutexCreated = false;
string mutexName = "Local\" + "tenghoo";
Mutex mutex = null;
พยายาม
-
mutex = Mutex ใหม่ (false, mutexName, ออก newMutexCreated);
-
catch (ข้อยกเว้น เช่น)
-
Console.Write (เช่น ข้อความ);
System.Threading.Thread.Sleep (3000);
สภาพแวดล้อมทางออก (1);
-
// สร้าง mutex เป็นครั้งแรก
ถ้า (newMutexCreated)
-
Console.WriteLine("โปรแกรมเริ่มต้นแล้ว");
//todo: นี่คืองานที่ต้องทำ
-
อื่น
-
Console.Write("หน้าต่างอื่นกำลังทำงานอยู่ และจะปิดโดยอัตโนมัติหลังจากผ่านไป 3 วินาที...");
System.Threading.Thread.Sleep (1,000);
Console.Write("1");
System.Threading.Thread.Sleep (1,000);
Console.Write("2");
System.Threading.Thread.Sleep (1,000);
Console.Write("3");
Environment.Exit(1);//ออกจากโปรแกรม
-
-
การดำเนินการอินสแตนซ์เดียวทั้งระบบ
โมฆะคงที่ส่วนตัว GlobalMutex()
-
// ไม่ว่าจะสร้าง mutex เป็นครั้งแรกหรือไม่
บูล newMutexCreated = false;
สตริง mutexName = "Global\" + "tenghoo";
Mutex mutex = null;
พยายาม
-
mutex = Mutex ใหม่ (false, mutexName, ออก newMutexCreated);
-
catch (ข้อยกเว้น เช่น)
-
Console.Write (เช่น ข้อความ);
System.Threading.Thread.Sleep (3000);
สภาพแวดล้อมทางออก (1);
-
// สร้าง mutex เป็นครั้งแรก
ถ้า (newMutexCreated)
-
Console.WriteLine("โปรแกรมเริ่มต้นแล้ว");
//todo: นี่คืองานที่ต้องทำ
-
อื่น
-
Console.Write("หน้าต่างอื่นกำลังทำงานอยู่ และจะปิดโดยอัตโนมัติหลังจากผ่านไป 3 วินาที...");
System.Threading.Thread.Sleep (1,000);
Console.Write("1");
System.Threading.Thread.Sleep (1,000);
Console.Write("2");
System.Threading.Thread.Sleep (1,000);
Console.Write("3");
Environment.Exit(1);//ออกจากโปรแกรม
-