3

ここに画像の説明を入力私は 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 を使用しているとしか想像できませんか?

EDIT 1:申し訳ありませんが、何を説明するのを忘れましたGetData()GetData()SAP でさまざまなレポートを実行します (大量のコード)。小さなログイン アニメーションが「ログイン」から「データの取得」に変わるので、視覚的にいつそこにあるかがわかります。UI がハングアップするのは、「ログイン」段階であることがわかります。ログイン アニメーションでは、単純な円が回転します。これはログインの途中で停止し、約 5 秒後に継続します。

EDIT 2: この行でハングが発生しているようです

SapRfcDestination = RfcDestinationManager.GetDestination(MyServer);

編集 3: UI がハングした時点でアプリケーションを一時停止すると、スレッドの写真が追加されました。

4

1 に答える 1

2

おそらく、内部に何もないGetDataか、内部のTask.Runラムダが、またはSAPLoginで UI スレッドをコールバックしようとしています。そのような可能性があるかどうかを最初に確認してください。Dispatcher.InvokeDispatcher.BeginInvokeDispatcher.InvokeAsync

次に、以下のようにコードを変更してみてください。Task.Factory.StartNewwithTaskCreationOptions.LongRunningが代わりにどのように使用されTask.Run、どのようにオフロードされるかに注意してくださいGetData(すでに であるにもかかわらず、ここで注意しasync.Unwrap()ください)。それが役に立った場合は、それぞれの変更を個別に試して、どちらが特に役に立ったか、または両方の組み合わせであったかを確認してください。

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
        await Task.Factory.StartNew(() => GetData(),
            CancellationToken.None,
            TaskCreationOptions.LongRunning,
            TaskScheduler.Default).Unwrap();

        Busy.Visibility = System.Windows.Visibility.Collapsed; // Hides progress animation
    }
}

private Task<bool> SAPLogin()
{
    bool LoggedIn = true;

    return Task.Factory.StartNew(() =>
    {
        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;
    }, 
    CancellationToken.None,
    TaskCreationOptions.LongRunning,
    TaskScheduler.Default);
}
于 2014-02-15T00:35:48.153 に答える