下面是代碼,一運行開始回圈就卡住界面,LISTBOX也不會顯示
namespace 網路連接檢查
{
/// <summary>
/// MainWindow.xaml 的互動邏輯
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Ip1_TextChanged(object sender, TextChangedEventArgs e)
{
}
private void Check1_Click(object sender, RoutedEventArgs e)
{
int runtimes = 0;
try
{
var F1 = new Func<string, bool>(TryPing);
var result = F1.BeginInvoke(((string)Ip1.Text),null,null);
bool result1 = F1.EndInvoke(result);
while (result1)
{
runtimes++;
List1.Items.Add("PING成功次數" + runtimes.ToString());
Thread.Sleep(5000);
var result2 = F1.BeginInvoke(((string)Ip1.Text), null, null);
result1 = F1.EndInvoke(result2);
}
Ipstatus1.Text = "PING成功次數" + runtimes.ToString() + "\t\t" + DateTime.Now.ToString() + "出現斷網";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public bool TryPing(string ip)
{
bool result = false;
Ping p = new Ping();
PingOptions options = new PingOptions();
options.DontFragment = true;
//string data="https://bbs.csdn.net/topics/test";
// byte[]buffer=Encoding.ASCII.GetBytes(data);
int timeout = 2000;
PingReply reply = p.Send(ip, timeout);
if (reply.Status == IPStatus.Success)
{
result = true;
}
else
{
result = false;
}
return result;
}
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
}
}
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
你的 while (result1) 已經阻塞了界面 UI 執行緒,界面當然會卡死了。uj5u.com熱心網友回復:
開個執行緒或者用定時器,在主執行緒用sleep肯定會卡uj5u.com熱心網友回復:
樓上兩位大哥,有沒有具體修改辦法uj5u.com熱心網友回復:
把你ping的代碼放到Task.Run(()=>{//ping的代碼
});
uj5u.com熱心網友回復:
通過代碼進行分析發現:1、你并不明白異步呼叫方式,在亂用,EndInvoke如果寫作異步的話,應該寫在回呼函式中,這是直接阻塞等待結果的,當在回呼函式中時,一般是異步方法已完成,直接獲取結果時使用。
2、如果你對UI界面沒有特殊要求,你還寫在WinForm吧,別WPF了,WPF更適合資料展示類,因為可以使用MVVM
3、你并不了解WPF的使用,WPF在以資料為驅動核心來編程的,一般不像WinForm一樣寫成事件驅動
4、最重要的,你C#基本還沒有入門
針對上面的代碼,建議:
1、明白Thread.Sleep()方法的功能,異步的實作和原理
2、建議在WinForm中做更好一些
uj5u.com熱心網友回復:
是不是可以用threadpool然后都丟到執行緒池里,做ping功能的函式丟到后臺,main函式怎么跑應該也不會卡死了?uj5u.com熱心網友回復:
了解基于事件的異步方式,盡量使用timer定時而不是while這種形式。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/123702.html
標籤:C#
