ここで、ローカルサーバーからExcelにデータをエクスポートする必要があります。私はその方法のためにasync
呼び出しを使用しています。しかし、それでも、データをエクスポートしながらUIをブロックしています。asyncを使用中にUIがブロックされ、Cで待機する#
UIがブロックされている理由を知ることができますか?
はまた、私は
1)
await
キーワードは、プロセスが完了 するまである程度の時間を待つために使用されるいくつかの明確化が必要で、その後、B同期と 非同期プロセスワット/ 違いは何ですか。2)1つのメソッドが
Async
タスクとして宣言されている場合、すべての内部メソッド は非同期として実行していますか?3)内部メソッド(method1、method2、method3)を実行しているとき、method3はとなりますが、method1に依存します。したがって、method1に
await
というキーワードを付けてください。私は ですか?
コードスニペット:
private async void ConvertExcel(object sender)
{
var excelEngine = new ExcelEngine();
var application = excelEngine.Excel;
var newbookWorkbook = application.Workbooks.Create(1);
var work = newbookWorkbook.Worksheets[0];
var openDialog = new SaveFileDialog
{
FilterIndex = 2,
Filter = "Excel 97 to 2003 Files(*.xls)|*.xls|Excel 2007 to 2013 Files(*.xlsx)|*.xlsx"
};
if (openDialog.ShowDialog() == true)
{
newbookWorkbook.Version = openDialog.FilterIndex == 1 ? ExcelVersion.Excel97to2003 : ExcelVersion.Excel2013;
}
else
return;
try
{
// This method is used to get the data from server.
var table = GetFullDataAsync();
work.ImportDataTable(table, true, 1, 1, true);
using (Stream stream = openDialog.OpenFile())
{
newbookWorkbook.SaveAs(stream);
}
newbookWorkbook.Close();
excelEngine.Dispose();
}
catch (Exception exception)
{
Console.WriteLine("Exception message: {0}",ex.Message);
}
}
internal async Task<DataTable> GetFullDataAsync()
{
DataTable dataTable = new DataTable();
dataTable = GetDataFromServer(DataEngine.Query,DataEngine.Connection);
dataTable.Locale = CultureInfo.InvariantCulture;
return dataTable;
}
public DataTable GetDataFromServer(string query, DbConnection connection)
{
if (connection.State != ConnectionState.Open)
{
connection.Open();
}
var command = connection.CreateCommand();
command.CommandText = query;
command.Connection = connection;
var reader = command.ExecuteReader();
var dataTable = new DataTable
{
Locale = System.Globalization.CultureInfo.InvariantCulture
};
dataTable.Load(reader);
return dataTable;
}
あなたの 'async'メソッドは何も' await'しません。また、 'async'メソッドからの戻り値の型は' Task'でなければなりません。 – Adwaenyth
メソッドは非同期ではありません。なぜなら、実際にはタスクやそれに類するものは何もしないからです。 'async'を追加するだけで魔法のように非同期にならないので、' await'とタスクも使う必要があります。 –