-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. 使用异步调用与您使用的架构层数无关。它与应用程序等待响应的方式有关。
    您的说法“windows phone 仅支持对 web 服务的异步调用,这使得线程等待响应”是错误的。进行异步调用意味着线程不等待响应。使用Async(and await) 关键字(如果您使用的是 Async CTP)代码仍然异步运行,但执行方式(就您而言)与同步时的方式相当。

  3. 同步方法没有提供,因为它们在移动环境中没有意义,主要有两个原因:

感知性能:
让应用程序在等待请求响应时不可用(由于阻塞线程)可能会在移动设备上造成糟糕的用户体验,就像用户通常与在他们手中的设备上运行的应用程序互动的方式一样(与 PC 相比)意味着任何暂停似乎都需要更长的时间。由于应用程序不等待响应,因此它能够显示等待指示符,允许用户执行其他操作(进程数量可能非常有限)或允许用户更轻松地取消请求。

偶尔(通常质量很差)
的连接:移动设备的连接,就其本质而言,与 PC 的连接不同。在移动设备中,您必须假设可能无法建立任何连接,或者根据所使用的连接方法,可能需要很长时间才能返回。如果用户使用 2G 网络连接,并且请求需要大量数据,则可能需要很长时间才能完成。您不想让用户一直等待。如果编写应用程序来处理异步请求,那么让该代码处理任何响应都不会返回也更容易。

为了避免同步代码的上述问题,需要像异步一样编写它。最好只剪掉中间人。

通过强制所有通信异步,开发人员(和设计人员)被迫考虑良好的移动应用程序开发和设计的这两个重要方面。反过来,这有助于避免创建性能非常差、无响应的应用程序。

于 2011-08-17T11:49:12.043 回答