unity中leancloud的异步操作完成后,是否只能在主线程里无限循环检测操作成功/失败的状态?

例如查询一个数据,成功或失败后都进行相应UI的更新。由于要调用Unity的接口,而continueWith里的代码不在主线程,是无法调用unity的api的,那么是否只能在主线程里设置一个机制,不停地循环检测查询数据操作的状态?

这样感觉又麻烦又消耗很多资源,请问leancloud官方有没有更推荐的设计模式啊?

这个找不到好的例子,感觉很多新手会卡在这里。
@wujun @asaka

可以在里面设置一个信号灯,而主线程利用 OnUpate 来读取这个信号灯的变化来做 UI 刷新,

string flag='none';

var task= ...
task.ContinueWith(t =>{
   if(s.Result != null){ 
       flag = 'failed';
   } else {
       flas = 'success';
   }
})

OnUpdate(){
   switc(flag){
      case 'failed':
       break
      case 'success':
       break;
   }
}

非常感谢。就是说还是只能从主线程出发主动查询数据的读取状态吧?

可以在主线程查询,但是 continueWith 里面的就是子线程了。你在子线程里面修改 flag,而 游戏引擎自带的 OnGUI 或者 OnUpdate 不是在主线程么?这样你在 OnUpdate 里面读取 flag 然后 在 页面上 Draw 你的游戏逻辑就可以了。

恩,我就是这个意思,非常感谢!
追加请问如何判断一个Task是否正在执行中?
1 task.IsFaulted == True,说明执行动作完成,但有错
2 task.IsComplete == True,说明执行动作完成
3 task.IsCanceled == True,说明执行动作完成,但被取消了

以上3个状态都好理解,但如何判断一个task是否在“执行中”?

额,没有执行中这个状态,因为一个 HTTP 请求太慢的话就直接被 Unity 所处在操作系统丢掉或者直接无响应。Task 这个类本身在微软的官方实现当中就没有「执行中」这么一个状态。

我记得在某个文档看到有“执行进度”这一说法,但先不管这个问题了,我可以用别的办法规避这个问题。我正在实现这个想法中,遇到一个关于Task的问题:

    using System.Threading.Tasks;


    Task loadOnline(string className, string id)
    {

        AVQuery<AVObject> query = new AVQuery<AVObject>(className);
        return query.GetAsync(id).ContinueWith (t =>
        {
            if (!t.IsFaulted)
            {
                Debug.Log("load成功");
                AVObject result = t.Result;
            }
            else
            {
                Debug.Log("load失败");
            }
        });
    }

因为不太明白你们是如何让Task可以使用的黑科技,请问这段代码这样用Task是可以的吗(主要疑问是using那里用的还是System那的task,感觉很奇怪)?我的想法是任何一个查询都将该task实例记录下来,主线程去判断task是否完成等状态。如果为null,则新建查询,这样就规避上述“执行中状态判断”的问题

谢谢!