我正在使用SAP .NET Connector 3.0并尝试使用单独的线程登录,因此我可以让UI显示一种登录动画。
我正在使用Async和Await来启动登录,但是在登录期间UI会挂起大约10秒钟。
这是代码,它粗糙,因为我正在快速起草一个程序。
async void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Busy.Visibility = System.Windows.Visibility.Visible; // Shows progress animation
if (await SAPLogin()) // Waits for login to finish, will always be true at the moment
{
await GetData(); // does things with sap
Busy.Visibility = System.Windows.Visibility.Collapsed; // Hides progress animation
}
}
private Task<bool> SAPLogin()
{
bool LoggedIn = true;
return Task.Run(() =>
{
Backend = new BackendConfig();
RfcDestinationManager.RegisterDestinationConfiguration(Backend);
SapRfcDestination = RfcDestinationManager.GetDestination(MyServer); // MyServer is just a string containing sever name
SapRap = SapRfcDestination.Repository;
BapiMD04 = SapRap.CreateFunction("MD_STOCK_REQUIREMENTS_LIST_API");
BapiMD04.SetValue("WERKS", "140");
return LoggedIn;
});
}
我只能想象任务中的某些内容正在使用UI?
编辑1:
抱歉忘了解释GetData()
的内容。
GetData()
在SAP中运行各种报告(大量代码)。在视觉上,我知道它何时出现,因为我的小登录动画将从&#34;登录&#34;到#&#34;抓取数据&#34;。
当我看到UI挂起时,我发现它是在&#34;登录&#34;相。登录动画有一个简单的循环旋转。这会在整个登录过程中停止,然后在大约5秒后继续。
编辑2: 悬挂似乎在这条线上出现了
SapRfcDestination = RfcDestinationManager.GetDestination(MyServer);
编辑3: 在我看到UI挂起的位置暂停应用程序时添加了线程照片。
答案 0 :(得分:2)
据推测,GetData
内的Task.Run
或SAPLogin
lambda内的任何内容都没有尝试使用Dispatcher.Invoke
,Dispatcher.BeginInvoke
或{{1}回调UI线程}。首先检查这种可能性。
然后,尝试更改您的代码,如下所示。请注意Dispatcher.InvokeAsync
使用Task.Factory.StartNew
代替TaskCreationOptions.LongRunning
以及Task.Run
如何卸载(尽管它已经GetData
,所以请注意async
) 。如果这有帮助,请单独尝试每个更改,看看哪个更有帮助,或者它是否是两者的组合。
.Unwrap()