我正在使用System.Threading.Timer異步重復某個任務。當任務準備好時,Start()應該執行原始執行緒(被呼叫的地方)上的一個方法。
public event EventHandler StatusChanged;
public void Start()
{
StatusChanged = new EventHandler(SomethingChangedMethod);
new Timer(Pending, null, 0, 1000);
}
private void Pending(object state)
{
//Do Something
StatusChanged?.Invoke(this, EventArgs.Empty);
}
由于我不在控制元件上或其他東西上,因此我無法呼叫Invoke()或BeginInvoke()。
uj5u.com熱心網友回復:
由于可以從庫外部呼叫 Start(),因此我無法真正控制它。
作為圖書館作者,您不知道正確的做法是什么。據您所知,原始執行緒在Start很久以前剛剛啟動并退出。您不知道回傳“相同”“執行緒”是正確的行為,所以當然,是的,您將其留給您的消費者。
以同樣的方式,作為庫作者,您不應該修復關于使用什么日志框架、是否以及如何向用戶顯示錯誤訊息(如果甚至有用戶)等的選擇。
做簡單的事情,發起你的事件,讓為應用程式挑選框架的人做出正確的選擇。因為你不應該(不一定會損害你圖書館的潛在消費者)
uj5u.com熱心網友回復:
首先,您可能會也可能無法向呼叫的執行緒發布訊息Start:如果該執行緒具有與其關聯的訊息佇列并且正在檢查該佇列,則您只能這樣做。UI 執行緒執行此操作,但例如執行緒池執行緒或您使用 創建的執行緒不會執行此操作new Thread()。
如果一個執行緒有一個與之關聯的訊息佇列,通常的做法是SynchronizationContext在該執行緒上安裝一個。您可以獲取執行緒的SynchronizationContextusing SynchronizationContext.Current,將其存盤起來,然后使用 that 將訊息發布到該執行緒的訊息佇列SynchronizationContext。如果執行緒上沒有SynchronizationContext安裝 ,則SynchronizationContext.Current回傳null.
public event EventHandler StatusChanged;
private Timer timer;
private SynchronizationContext synchronizationContext;
public void Start()
{
synchronizationContext = SynchronizationContext.Current;
StatusChanged = new EventHandler(SomethingChangedMethod);
timer = new Timer(Pending, null, 0, 1000);
}
private void Pending(object state)
{
// Do Something
if (synchronizationContext != null)
{
synchronizationContext.Post(_ => StatusChanged?.Invoke(this, EventArgs.Empty), null);
}
else
{
StatusChanged?.Invoke(this, EventArgs.Empty);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/322095.html
