我一直在嘗試使函式異步運行以防止視窗在每次 ping 新地址時凍結,但是當我嘗試實作它時,VS 說我不能使用 await 運算子,因為它是當前狀態。有什么建議?
public MainWindow()
{
//var reader = new Mp3FileReader(@"Resources\Audio\02 Connecting.flac");
MediaFoundationReader sound = new MediaFoundationReader(@"Resources\Audio\Connecting.mp3");
var waveOut = new WaveOut(); // or WaveOutEvent()
waveOut.Init(sound);
waveOut.Play();
InitializeComponent();
ContentRendered = (s, e) => { await Connecting(); };
}
private async Task Connecting()
{
AutoResetEvent waiter = new AutoResetEvent(false);
IPAddress ip = IPAddress.Parse("23.185.0.1");
var pingSender = new Ping();
pingSender.PingCompleted = PingCompletedCallback;
pingSender.SendAsync(ip, 1000, waiter);
}
uj5u.com熱心網友回復:
問題是您試圖await在同步委托中使用:
ContentRendered = (s, e) => { await Connecting(); };
要使用await關鍵字,您需要定義一個異步委托,然后將其添加到事件中。
這應該有效 - 請注意async啟用await關鍵字的關鍵字:
ContentRendered = async (s, e) => { await Connecting(); };
您還應該等待異步pingSender.SendAsync方法:
await pingSender.SendAsync(ip, 1000, waiter);
uj5u.com熱心網友回復:
除非您Connecting在多個地方使用異步方法,否則從可維護性的角度來看,將經典事件處理程式附加到事件可能更可取ContentRendered:
ContentRendered = ContentRenderedHandler;
//...
private async void ContentRenderedHandler(object sender, EventArgs e)
{
IPAddress ip = IPAddress.Parse("23.185.0.1");
var pingSender = new Ping();
PingReply pingReply = await pingSender.SendPingAsync(ip, 1000);
// Use the `pingReply` here
}
這與 Ermiya Eskandary 在他們的回答中所建議的基本相同,唯一的區別是async void方法上的存在是可見的和明確的。async void這里的使用是正確的,因為該方法是一個事件處理程式。不過,明確表示是個好主意,因為async void方法經常被誤用,導致意外行為或編譯器警告,或兩者兼而有之。
更新:您的代碼使用了不合時宜的PingCompleted SendAsync方法。該Ping級提供了新的SendPingAsyncAPI(.NET框架4.5及更高版本),可直接與異步的await消耗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/321725.html
