基本上,我做了一個 System.Timers.Timer 計時器,并且我使用了一種方法來打開一個新執行緒并運行計時器。每次發生變化時,例如當我不在游戲中時,它會更改標簽,然后在兩秒鐘后崩潰。我嘗試使用 Dispatcher.Invoke() 來防止出現“不同執行緒”錯誤,它成功更改了標簽然后崩潰,我還使用了 Dispatcher.BeginInvoke(),它給了我一個 AccessException 或其他東西。我正在嘗試找到一種方法使其不會崩潰,并在更改不同標簽時使其平穩運行。
System.Timers.Timer tm = new System.Timers.Timer();
System.Timers.Timer tma = new System.Timers.Timer();
public ElapsedEventHandler Injection()
{
if (inject == true)
{
Dispatcher.Invoke(new Action(delegate
{
tm.Start();
tma.Stop();
StatusLabel.Content = "Injecting..".ToString();
}));
}
else if (api.currentlyinjecting == true)
{
Dispatcher.Invoke(() =>
{
if (StatusLabel.Content.ToString() == "Injecting..")
{
}
else
{
StatusLabel.Content = "Injecting..";
}
});
tm.Start();
tma.Stop();
}
else
{
if (api.AlreadyInjected() == false)
{
Dispatcher.Invoke(() =>
{
if (StatusLabel.Content.ToString() == "Not Injected")
{
}
else
{
StatusLabel.Content = "Not Injected";
}
});
}
else
{
Dispatcher.Invoke(() =>
{
if (StatusLabel.Content.ToString() == "Not Injected")
{
}
else
{
StatusLabel.Content = "Not Injected";
}
});
}
}
return Injection();
}
public ElapsedEventHandler Injection2()
{
if (api.AlreadyInjected())
{
if (StatusLabel.Content.ToString() == "Injected")
{
if (api.AlreadyInjected() == false)
{
tma.Start();
tm.Stop();
}
}
else
{
Dispatcher.Invoke(() =>
{
StatusLabel.Content = "Injected";
});
}
}
return Injection2();
}
uj5u.com熱心網友回復:
您在方法return Injection();結束時呼叫Injection,這將導致永無止境的遞回。
在軟體中,如果呼叫堆疊指標超出堆疊邊界,則會發生堆疊溢位。呼叫堆疊可能由有限數量的地址空間組成,通常在程式開始時確定。資源
簡單地說:當呼叫一個方法時,當前變數/引數被壓入堆疊(一些記憶體系結到執行緒),并在退出該方法時被清理。如果您在方法中一遍又一遍地呼叫該方法,使用的記憶體將堆積起來,直到超過它的大小。您的程式將因堆疊溢位而崩潰。(這不是你可以嘗試/捕捉的例外)
對于Injection2.
該Injection方法應該由計時器呼叫,而不是由您的方法呼叫。
您應該為 WPF 使用DispatcherTimer,這將產生更簡潔的代碼,因為您不需要呼叫。
如果您詳細介紹 API,我們可能會提供一個更好的示例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/448340.html
