在用戶界面中,我需要用戶從網絡上的所有可用實例中選擇一個SQL Server。我使用一個按鈕讓用戶點擊以顯示服務器。點擊按鈕後大約需要25秒,才能顯示列表。我想在加載頁面時準備好服務器列表。所以當用戶點擊按鈕時,列表已經準備就緒。但是,在頁面加載之前它會卡住。 RemoteSqlServers用於ItemSource。如何使用異步獲取網絡SQL服務器
internal static ObservableCollection<string> remoteSqlServers = GetRemoteSqlServers().Result;
public static async Task<ObservableCollection<string>> GetRemoteSqlServers()
{
var SqlServers = await Task<ObservableCollection<string>>.Run(() =>
{
return new SqlEnumerationHelper().SqlEnumerateRemote();
}).ConfigureAwait(false);
return SqlServers;
}
我把它改成了下面,它在加載之前沒有卡住,但它仍然需要幾秒鐘。看起來async不工作,不知道爲什麼。
public static ObservableCollection<string> remoteSqlServers = new ObservableCollection<string>();
public GetSqlViewModel()
{
...
remoteSqlServers = GetRemoteSqlServers().Result;
...
}
public static async Task<ObservableCollection<string>> GetRemoteSqlServers()
{
var SqlServers = await Task<ObservableCollection<string>>.Run(() =>
{
return new SqlEnumerationHelper().SqlEnumerateRemote();
}).ConfigureAwait(false);
return SqlServers;
}
這裏是SqlEnumerateRemote:
public ObservableCollection<string> SqlEnumerateRemote()
{
ObservableCollection<string> sqlServerNames = new ObservableCollection<string>();
LogHelper.log("SqlEnumerationHelper:SqlEnumerateRemote", "Starting");
try
{
//Make an initial call to the sql browser service to wake it up
using (DataTable sqlSources = SqlDataSourceEnumerator.Instance.GetDataSources())
{
//There are issues with SqlDataSourceEnumerator, that it doesn't always return all sql instances
}
SqlDataSourceEnumerator instance = SqlDataSourceEnumerator.Instance;
System.Data.DataTable dt = instance.GetDataSources();
DataRow[] rows = dt.Select(string.Empty, "ServerName asc");
if (rows.Length > 0)
{
foreach (DataRow dr in rows)
{
string serverName = dr["ServerName"].ToString();
string instanceName = dr["InstanceName"].ToString();
if (instanceName.Length > 0)
serverName += "\\" + instanceName;
sqlServerNames.Add(serverName);
}
}
LogHelper.log("SqlEnumerationHelper:SqlEnumerateRemote", "Ending");
}
catch (Exception e)
{
LogHelper.log("SqlEnumerationHelper:SqlEnumerateRemote", "SqlDataSourceEnumerator.GetDataSources and assoc processing failed" + e.Message);
}
return sqlServerNames;
}
將它的工作設置remoteSqlServers馬上空,然後在任務,填充它?對我來說,它似乎仍然在等待remoteSqlServers在繼續之前獲得一個值。 – Dylan
如果我先將它設置爲null,那麼我應該在什麼時候從GetRemoteSqlServers()方法獲得真正的值? –