使用await与Task.Run,​​但UI仍然挂起几秒钟?

时间:2014-02-14 08:53:41

标签: c# async-await sap-connector

enter image description here我正在使用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挂起的位置暂停应用程序时添加了线程照片。

1 个答案:

答案 0 :(得分:2)

据推测,GetData内的Task.RunSAPLogin lambda内的任何内容都没有尝试使用Dispatcher.InvokeDispatcher.BeginInvoke或{{1}回调UI线程}。首先检查这种可能性。

然后,尝试更改您的代码,如下所示。请注意Dispatcher.InvokeAsync使用Task.Factory.StartNew代替TaskCreationOptions.LongRunning以及Task.Run如何卸载(尽管它已经GetData,所以请注意async) 。如果这有帮助,请单独尝试每个更改,看看哪个更有帮助,或者它是否是两者的组合。

.Unwrap()