0

如何将这 2 个操作变成 1 个操作?实际上我在后台代理中使用了,但是第二个操作无法执行并且无法获取值。任何的想法?

public void running()
{    
  ServiceReference1.WebServiceSoapClient test = new ServiceReference1.WebServiceSoapClient();

  test.ReadTotalOutstandingInvoiceCompleted += new EventHandler<ServiceReference1.ReadTotalOutstandingInvoiceCompletedEventArgs>(serviceClient);  

  test.ReadTotalOutstandingInvoiceAsync();
}

public void serviceClient(object sender, ReadTotalOutstandingInvoiceCompletedEventArgs e)
{

  answer = int.parse(e.Result.ToString());
}

更新:在后台代理:

        VibrateController testVibrateControl = VibrateController.Default;
        public int answer;


        protected override void OnInvoke(ScheduledTask task)
        {
            //TODO: Add code to perform your task in background
            running();

            ShellTile t = ShellTile.ActiveTiles.First();

            StandardTileData d = new StandardTileData()
            {
                Title = "U have " + answer + " Invoice!!",
                BackTitle = "How Are You!!",
                //Count = 0,
                // BackBackgroundImage = new Uri("dog.jpg", UriKind.Relative),
                // BackgroundImage = new Uri("untitled.png", UriKind.Relative)
            };
            t.Update(d);

            testVibrateControl.Start(TimeSpan.FromSeconds(3));
            testVibrateControl.Stop();
            //ShellTile.Create(new Uri("/MainPage.xaml?pp=cas", UriKind.Relative), d);
            NotifyComplete();
        }

在主页:

        private void CheckBox_Checked_1(object sender, RoutedEventArgs e)
        {
            try
            {
                PeriodicTask p = new PeriodicTask("jj");
                p.Description = "Don't push the red button";
                ScheduledActionService.Add(p);
                //ScheduledActionService.LaunchForTest(p.Name, TimeSpan.FromSeconds(2));
                #if (DEBUG_AGENT)
                ScheduledActionService.LaunchForTest(p.Name, TimeSpan.FromSeconds(2));
                #endif
            }
            catch (Exception ex)
            {
            }
        }
4

1 回答 1

0

在 99.9% 的情况下,将异步调用转换为阻塞调用是一个坏主意,所以我很想知道你为什么需要它。

如果从未执行第二个操作,则可能存在服务器端或连接问题。假设您使用的是 WCF 服务,请使用WCF 测试客户端检查返回的结果是否与您期望的一样。

据我所知,NotifyComplete在触发回调之前调用,这很可能是问题所在。虽然所有其他调用都被单步执行,但存在潜在的竞争条件,即回调不够快,无法在代理执行完成通知操作系统之前被触发。

您可以做的是在内部包装回调。像这样:

ServiceReference1.WebServiceSoapClient test = new ServiceReference1.WebServiceSoapClient();
test.ReadTotalOutstandingInvoiceCompleted += (s,e) =>
{
   // Do some things here
   NotifyComplete();
};

test.ReadTotalOutstandingInvoiceAsync();

从那里继续,为什么不让它返回一个int开始,这样你就不必解析它了?

于 2013-03-12T01:58:05.543 回答