在过去的几周里,我一直在使用Xamarin和Webservices(在Xamarin中称为.NET 2.0 Web服务)。而且我遇到了一些我无法解决的问题。
1st)如何设置webservice的超时?无论其值如何,都会忽略Timeout属性。我相信使用的默认值大约是30秒。但是我想要5秒~~。
2nd)当WebService使用Begin调用任何方法async时。无论如何都要检查异步方法是否正确完成或超时?我必须“检查”的唯一方法是在End方法中执行try / catch。如果由于超时而被触发,则会引发异常。但我想知道是否有某些属性或方法会告诉我webservice调用是否超时或是否正确处理。这里使用的webservice方法是“IsAlive”。
WebService.MainService.BeginIsAlive ((ar) =>
{
try
{
bool result = WebService.MainService.EndIsAlive (ar); //If timedout will raise an exception.
RunOnUiThread (() =>
{
Toast.MakeText (this, "Running as expected...", ToastLength.Long).Show();
});
StartActivity (typeof(OtherScreen));
}
catch (Exception ex)
{
//Probably timeout.
}
}, null);
3rd)有没有办法取消web服务异步操作?例如“CancelIsAlive”。我找到的唯一方法是Webservice.Abort。但我不认为这是一种最佳实践,因为它不具体,它可能会搞砸所有事情。
先谢谢,LuísHenrique。
答案 0 :(得分:1)
这就是我通常用来调用WebServices并控制它们(假设你的ws函数需要一个字符串并返回一个字符串):
public static void CallSomeFunction(string SomeParameter, Action<string> Ok, Action Error, Activity Context)
{
ThreadPool.QueueUserWorkItem ((object e) => {
var proxy = new YourProxyClass();
proxy.Timeout = 10000;
try{
var res = proxy.YourFunction(SomeParameter);
Context.RunOnUiThread(() => Ok(res));
}
catch(Exception Ex){
if(Error != null)
Context.RunOnUiThread(Error);
}
});
}
这是我执行异步任务的方式,使用ThreadPool进行同步调用,如果一切正常或错误,则传递一些Actions来执行。此外,我正在传递一个Context,因此我的Ok和Error操作将在UI线程中执行。