特定のネットワークをスキャンして有効なIPアドレスを返すWinFormsプロジェクトがあります。すべてのアドレスが見つかると、それぞれのユーザーコントロールを作成してフォームに配置します。 ipアドレスへの私の機能は、何か他のことをする前に実行するのを "待つ"と思ったasync
とTask
を使っていますが、そうではありません。フォームが空白になり、5秒以内にすべてのユーザーコントロールがフォームに表示されます。非同期関数が完了する前にフォームが表示されています
宣言:
private List<string> networkComputers = new List<string>();
ここForm_Loadイベントだ:
private async void MainForm_Load(object sender, EventArgs e)
{
//Load network computers.
await LoadNetworkComputers();
LoadWidgets();
}
LoadNetworkComputers
機能はここにある:
private async Task LoadNetworkComputers()
{
try
{
if (SplashScreenManager.Default == null)
{
SplashScreenManager.ShowForm(this, typeof(LoadingForm), false, true, false);
SplashScreenManager.Default.SetWaitFormCaption("Finding computers");
}
else
Utilities.SetSplashFormText(SplashForm.SplashScreenCommand.SetLabel, "Scanning network for computers. This may take several minutes...");
networkComputers = await GetNetworkComputers();
}
catch (Exception e)
{
MessageBox.Show(e.Message + Environment.NewLine + e.InnerException);
}
finally
{
//Close "loading" window.
SplashScreenManager.CloseForm(false);
}
}
そして最後に2つの機能:
private async Task<List<string>> GetNetworkComputers()
{
networkComputers.Clear();
List<string> ipAddresses = new List<string>();
List<string> computersFound = new List<string>();
for (int i = StartIPRange; i <= EndIPRange; i++)
ipAddresses.Add(IPBase + i.ToString());
List<PingReply> replies = await PingAsync(ipAddresses);
foreach(var reply in replies)
{
if (reply.Status == IPStatus.Success)
computersFound.Add(reply.Address.ToString());
}
return computersFound;
}
private async Task<List<PingReply>> PingAsync(List<string> theListOfIPs)
{
var tasks = theListOfIPs.Select(ip => new Ping().SendPingAsync(ip, 2000));
var results = await Task.WhenAll(tasks);
return results.ToList();
}
MainForm_Load
イベントのコードが終了する前に、フォームが表示されている理由について私は本当に固執しています。私はLoadNetworkComputers
で、それはユーザーがアプリが実行されていることを知ることができますスプラッシュフォームをロードすることを言及するのを忘れ
EDIT 。フォームがその背後に現れ、私が避けようとしているときです。ここで、スクリーンショットは(機密情報がブラックアウトされています)です:
おそらく私は何かが不足していますが、長時間の操作が進んでいる間にコードを続行できるようにすることは非同期/完全な目的ではありませんか? – Steve