-1

最近、SharePoint Windows Phone の統合に取り組みました。通信には、sharepoint が提供する Web サービスを使用しました。

そこから、Windows phone は Web サービスへの非同期呼び出しのみをサポートし、残りのコード行の実行を開始し、応答を取得すると実行を開始することがわかりました。しかし、この場合、私のロジックが Web サービスの応答に依存していると仮定すると、Web サービスの非同期呼び出しを呼び出すことは役に立ちません。openreadcompleted またはこれらの種類のイベントなどにすべてのロジックを記述する必要があります。

これはすべてのシナリオで機能するわけではないので、通信用のクラス名 CustomTask を作成し、コードを以下に示します。

MainClass
{
        foreach (Task t in tasks)
        {

                CustomTask objCustomTask = new CustomTask();
                objCustomTask.IsTaskCompleted += new EventHandler<CustomEventArgs>(objCustomTask_IsTaskCompleted);
                objCustomTask.sortTasks(t.ID, t);

        }
}

public class CustomTask
{
    public event System.EventHandler<CustomEventArgs> IsTaskCompleted;
    CustomEventArgs objCustomEventArgs = new CustomEventArgs();
    WorkflowService.WorkflowSoapClient ws = new WorkflowService.WorkflowSoapClient();

    public void sortTasks(String id, Task t)
    {
        objCustomEventArgs.objTask = t;
        ws.CookieContainer = Login.cookieJar;
        ws.GetWorkflowDataForItemAsync("TaskName");
        ws.GetWorkflowDataForItemCompleted += new EventHandler<WorkflowService.GetWorkflowDataForItemCompletedEventArgs>(ws_GetWorkflowDataForItemCompleted);
    }

    void ws_GetWorkflowDataForItemCompleted(object sender, WorkflowService.GetWorkflowDataForItemCompletedEventArgs e)
    {


        objCustomEventArgs.IsPendingTask = false;
        XElement objxelement = e.Result;
        IEnumerable<XElement> objXElementColl = objxelement.Descendants(XName.Get("ActiveWorkflowsData", Constant.strWorkflowList));
        foreach (XElement objXElementWorkflowTemplate in objXElementColl)
        {
            XElement objXElementWorkflows = objXElementWorkflowTemplate.Element(XName.Get("Workflows", Constant.strWorkflowList));
            if (objXElementWorkflows != null && objXElementWorkflows.HasElements == false)
            {
                objCustomEventArgs.IsPendingTask = true;
            }
        }
        IsTaskCompleted(sender, objCustomEventArgs);

    }

    public List<Task> GetPendingTask()
    {
        return null;
    }

}

私の仕事は終わりましたが、いくつか質問があります。

  1. 私が使用した方法は、アプリケーションのパフォーマンスに影響しますか?

  2. 非同期呼び出しは、3 層アーキテクチャを実装できないことを意味しますか?

  3. 同期呼び出しがサポートされていない理由。

4

1 に答える 1

2
  1. パフォーマンスの問題である可能性が高いため、コードから飛び出すことは明らかではありません。確実に知る唯一の方法は、それを実行し、必要に応じて測定することです。

  2. 非同期呼び出しの使用は、使用しているアーキテクチャー層の数とは何の関係もありません。これは、アプリケーションが応答を待機する方法に関連しています。
    「WindowsPhoneはWebサービスへのASync呼び出しのみをサポートしているため、スレッドは応答を待機します」という記述は間違っています。非同期呼び出しを行うということは、スレッドが応答を待たないことを意味します。Async(および)キーワードを使用すると(await非同期CTPを使用している場合)、コードは非同期で実行されますが、同期の場合と同等の方法で実行されます(関係する限り)。

  3. 同期メソッドは、次の2つの大きな理由により、モバイルコンテキストでは意味をなさないため、利用できませんでした。

知覚されるパフォーマンス:
リクエストからの応答を待機している間、アプリケーションを使用できなくすると(スレッドがブロックされているため)、ユーザーが手元のデバイスで実行されているアプリを通常使用する方法として、モバイルデバイスでひどいユーザーエクスペリエンスが発生する可能性があります(PCと比較して)は、一時停止が比較的長くかかるように見えることを意味します。アプリは応答を待機していないため、待機インジケーターを表示したり、ユーザーが他のことを実行できるようにしたり(プロセスの数が非常に限られている場合もあります)、ユーザーがリクエストをはるかに簡単にキャンセルできるようにしたりできます。

時折発生する(そして多くの場合品質が低い)接続性:
モバイルデバイスの接続性は、その性質上、PCの接続性とは異なります。モバイルでは、接続が確立されない可能性があること、または使用されている接続方法に基づいて、戻るまでに長い時間がかかる可能性があることを想定する必要があります。ユーザーが2Gネットワ​​ーク接続を使用していて、要求が大量のデータを要求している場合、完了するまでに長い時間がかかる可能性があります。ユーザーをずっと待たせたくはありません。非同期要求に対処するようにアプリケーションが作成されている場合は、応答が返ってこない場合にそのコードを処理する方が簡単です。

同期コードに関する上記の問題を回避するには、非同期であるかのようにコードを記述する必要があります。仲買人を切り取った方がいいです。

すべての通信を非同期にすることにより、開発者(および設計者)は、優れたモバイルアプリケーションの開発と設計のこれら2つの重要な側面を考慮することを余儀なくされます。これにより、パフォーマンスが非常に低く、応答のないアプリの作成を回避できます。

于 2011-08-17T11:49:12.043 に答える