我有一個類,我只想在一個執行緒中使用。如果我在一個執行緒中創建該類的物件并在另一個執行緒中使用它,則會導致很多問題。目前,我這樣解決這個問題:我有 Context 類,我只想在一個執行緒中使用它:
public class Context
{
public Thread CreatedThread { get; }
public Context()
{
CreatedThread = Thread.CurrentThread;
}
public void AssertThread()
{
if (CreatedThread != Thread.CurrentThread)
{
throw new InvalidOperationException("Use only one thread!");
}
}
//Lot of properties and methods here
}
這是學生類中 Context 類的用法:
public class Student
{
Context context;
public Context Context
{
get
{
if (context == null)
context = new Context();
context.AssertThread();
return context;
}
}
}
當我在不同的執行緒中使用背景關系時,它會拋出一個錯誤:
var student = new Student();
var context = student.Context;
Task.Run(() =>
{
var context = student.Context;//InvalidOperationException
});
但是這個解決方案并不可靠。例如,當我有另一個使用背景關系的類時,我需要在獲取背景關系屬性時執行 AssertThread。或者當我在一個新變數中獲取背景關系并在不同的執行緒中使用它時,我的例外不會被拋出。那么,是否有任何解決方案可以強制僅在一個執行緒中使用類?
uj5u.com熱心網友回復:
AssertThread()AFAIK 既沒有 C# 語言也沒有標準的 .NET API 提供一種在類的每個公共方法和屬性的開頭自動嵌入檢查的方法。如果您不喜歡手動添加此檢查的想法,并且您對此很認真,則可能需要搜索一些可以在編譯時自動為您添加此檢查的工具/插件,例如PostSharp、Fody或替代品。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/432677.html
