积极答复者
win8 中遇到一个棘手的问题,跪拜高手!

问题
-
我遇到的这样的问题,我一个按钮事件中调用了另外一个类中的方法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();
}
}
- 已编辑 Billy-NuoYan 2013年8月4日 15:32
答案
-
Dispatcher.RunAsync 这个起的是UI线程,你换成非UI线程试试?
http://msdn.microsoft.com/en-us/library/windows/apps/jj248677.aspx
- 已编辑 Jesse JiangModerator 2013年8月8日 8:13
- 已建议为答案 Jamles HezModerator 2013年8月9日 3:36
- 已标记为答案 Jamles HezModerator 2013年8月14日 5:43
全部回复
-
我一个下载任务,在下载按钮事件里去调用另外一个专门的下载方法,为了主线程和下载分开,我在下载方法里特意开了个线程去做下载,但还没到下载就报错了(到发送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(); //这里开始去下载
}
}
跪求大神!帮忙看下如何解决! -
Dispatcher.RunAsync 这个起的是UI线程,你换成非UI线程试试?
http://msdn.microsoft.com/en-us/library/windows/apps/jj248677.aspx
- 已编辑 Jesse JiangModerator 2013年8月8日 8:13
- 已建议为答案 Jamles HezModerator 2013年8月9日 3:36
- 已标记为答案 Jamles HezModerator 2013年8月14日 5:43