none
win8 中遇到一个棘手的问题,跪拜高手! RRS feed

  • 问题

  • 我遇到的这样的问题,我一个按钮事件中调用了另外一个类中的方法B,B方法中有异步获取本地数据的方法,也有发生HTTP命令的方法,但现在出现,B方法中的所有方法,流程都没走完,按钮事件的线程就完成了(也就走完了代码域),等按钮事件代码域全部完成之后,又回到了b方法中的异步方法继续执行,执行中会出现这样的错误提示哪位高手知道这个怎么处理不?补充一点,我在每个B方法中的每个异步方法,或者命令后面都有加上await asyncManualRestEvent.WaitAsync();   
                    App.asyncManualRestEvent.Reset(); 进行等等命令的回调函数执行完毕,再继续往下走。

    void btnPaste_Tapped(object sender, TappedRoutedEventArgs e)

    {

    BeginTaskFileHandle();      //这里面都没完成执行完,就继续走该事件的下面了

    }

    class TaksClass

    {

    void BeginTaskFileHandle()

    {

    //下面是一个本地数据异步获取

    LocalFIle();

     await App.asyncManualRestEvent.WaitAsync();
                App.asyncManualRestEvent.Reset();

     

    //下面是http协议发送,会有一个命令回调函数,回调函数名为CellBack

    icommand.SendGetDavDownLoadFile();    在发送这些命令的时候出现,按钮事件代码域已完成,等这里CellBack回调回来的时候就出现以上错误提示,跪求高手指点

     await App.asyncManualRestEvent.WaitAsync();
                App.asyncManualRestEvent.Reset();

     async BOOL   LocalFIle()

    {

    try
                    {
                        folder = await StorageFolder.GetFolderFromPathAsync(strFilePath);   //根据文件夹名获取该文件
                        isHave = true;
                    }
                    catch (FileNotFoundException eex)
                    {
                       
                        return isHave = false;
                    }

    }

    }

    void  CellBack()

    {

    //   省略中间处理代码

    App.asyncManualRestEvent.Set();

    }

    }


    2013年8月4日 15:30

答案

全部回复

  • 没人嘛!!急 急 啊!
    2013年8月5日 6:51
  • very easy:

    async void btnPaste_Tapped(object sender, TappedRoutedEventArgs e)

    {

    await BeginTaskFileHandle();

    }

    class TaksClass

    {

    async Task BeginTaskFileHandle()

    {

    2013年8月6日 1:19
  • 谢谢您的回复! 我尝试过你说的方法,同样会先回到按钮事件执行,之后再到回调中执行,回调执行完会出现下面的错误提示:,如何解决呢?
    2013年8月6日 1:53
  • 上传一个完整的例程,方便大家调试
    2013年8月6日 2:38
    版主
  • 因为你提供代码段并不完整,而我只能提供修改的意见和提示。你程序其实地方的代码需做必要的修改,或者你提供完整的代码,大家一起修改。

    还有尽可能简化代码。

    异步编程还同时使用callback,是否有必要?

    2013年8月6日 2:43
  • 你好,代码会比较多,方便加下你吗,或者加我嘛,我向你请教请教!我的qq564463141    skype:Billy
    2013年8月6日 3:23
  • 你好,代码会比较多,同时这个底层库需要跟我们自己设备关联,所以放上全代码在你们那边也无法运行起来。如果方便的话可加下你吗,或者加下我,我向你请教请教!被这个问题实在是纠结了好几天了,都不知道怎么解决了。我的qq 564463141    skype:Billy   先谢谢大家了!
    2013年8月6日 3:26
  • 我一个下载任务,在下载按钮事件里去调用另外一个专门的下载方法,为了主线程和下载分开,我在下载方法里特意开了个线程去做下载,但还没到下载就报错了(到发送http协议获取文件就出错了)报如下错误代码如下:private async void btnPaste_Tapped(object sender, TappedRoutedEventArgs e)
    {
               await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    //将当前任务放入到上传下载的界面
                    SetCollapsed();
                    LeftDownloadListView.Visibility = Visibility.Visible;
                    DownloadGrid.Visibility = Visibility.Visible;
                    DownloadList.Visibility = Visibility.Visible;
                    DownloadList.ItemsSource = curentCopyTaskInfo;

                    App.transferFileParserHandle.AddCopyTaskFileArray(curentCopyTaskInfo);
                    App.transferFileParserHandle.BeginCoppyTaskFileHandleProcess();       //开始执行上传下载
                });
    }

    public void BeginCoppyTaskFileHandleProcess()
            {
                if (!isBeginWorkThread)
                {
                    isBeginWorkThread = true;

                    //开始下载处理流程
                    BeginThreadToHandleCopyTaskCommand();
                }
            }

      //启动线程开始工作
            public void BeginThreadToHandleCopyTaskCommand()
            {
                //判断是否发送命令
                //wait to do this function

                Task task = Task.Run(() =>
                {
                    BeginCopyTaskHandle();
                });
            }
    public void BeginCopyTaskHandle()
    {
                 //设置状态为正在传输
                curCoppingTaskFile.status = (int)CopyTaskInfo.CopyTaskStatus.CopyStatusCopping;

                //修改数据库
                //wait to do this function
                App.allDataBaseMethod.UpdataToCopyTaskInfo(curCoppingTaskFile.taskID, curCoppingTaskFile.status);
                curTransferHandle.BeginThreadToTransferFile(curCoppingTaskFile);
    }

    public async void BeginThreadToTransferFile(CopyTaskInfo copyTaskInfo)
            {
                curTransferFile = copyTaskInfo;
                copyTaskTransferSpeed = 0;
                curTaskCmdStatus = (int)CopyTaskCmdStatus.CopyTaskCmdStatusNone;

                //发送获取磁盘剩余容量
                JudgeDiskSizeAccordingToTaskType();
                await App.asyncManualRestEvent.WaitAsync();
                App.asyncManualRestEvent.Reset();

                //判断磁盘容量是否足够此次操作
                if (JudgeDiskSize())
                {
                    //容量足够  --  //启动线程 判断原文件是否存在
                    BeginTransferFileHandlePropcess();
                }
                else
                {
                    //通知磁盘容量不足,结束此次操作

                }
            }

    public async void BeginTransferFileHandlePropcess()
            {
                bool isExitFile = await IsExitOriginSourceFile();    //执行到这里,报上面对错误,这里是去发送http协议,发送完就报错了,发送到时候btnPaste_Tapped事件已执行完了。
               if (!isExitFile)
                {
                    //源文件不存在   -- 发送错误提示
                    App.transferFileParserHandle.isBeginWorkThread = false;
                    WriteLog.TraceWriterLogMessage("源文件不存在, CopyTaskTransferHandle类中");
                    MessageDialog mg = new MessageDialog("信息提示");
                    mg.Content = "源文件不存在";
                    await mg.ShowAsync();
                    return;
                }

                bool isExitDistFile = await IsExitDirestSourceFile();
                if (isExitDistFile)
                {
                    //目的文件存在 --提示是覆盖还是继续追加还是取消

                         StartTask();     //这里开始去下载

                 }
                else
                {
                    //没有相同的目的文件,直接操作
                    StartTask();    //这里开始去下载
                }
            }


    跪求大神!帮忙看下如何解决!
    2013年8月7日 4:36
  • 呜呜!死在这个问题上咯!
    2013年8月7日 8:00
  • Dispatcher.RunAsync 这个起的是UI线程,你换成非UI线程试试?

    http://msdn.microsoft.com/en-us/library/windows/apps/jj248677.aspx


    2013年8月8日 8:13
    版主