src*_*091 1 c# timeout exception timer windows-phone-8
在我的winphone应用程序中,我有一个奇怪的情况,我得到的System.IO.FileNotFoundException代码与文件没有任何关系.
我有一个管理延迟函数调用的类:
// Delayed function manager
namespace Test
{
public static class At
{
private readonly static TimerCallback timer =
new TimerCallback(At.ExecuteDelayedAction);
public static void Do(Action action, TimeSpan delay,
int interval = Timeout.Infinite)
{
var secs = Convert.ToInt32(delay.TotalMilliseconds);
new Timer(timer, action, secs, interval);
}
public static void Do(Action action, int delay,
int interval = Timeout.Infinite)
{
Do(action, TimeSpan.FromMilliseconds(delay), interval);
}
public static void Do(Action action, DateTime dueTime,
int interval = Timeout.Infinite)
{
if (dueTime < DateTime.Now) return;
else Do(action, dueTime - DateTime.Now, interval);
}
private static void ExecuteDelayedAction(object o)
{
(o as Action).Invoke();
}
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个管理ProgressIndicator状态的类:
namespace Test
{
public class Indicator
{
public DependencyObject ThePage;
public ProgressIndicator Progressor;
public Indicator(DependencyObject page)
{
ThePage = page;
Progressor = new ProgressIndicator();
SystemTray.SetProgressIndicator(ThePage, Progressor);
}
// If set(true) then set(false) in one second to remove ProgressIndicator
public void set(bool isOn)
{
Progressor.IsIndeterminate = Progressor.IsVisible = isOn; // Exception happens on this line
if (isOn) At.Do(delegate { this.set(false); }, 1000);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试set(true)在代码中运行方法时,我得到以下异常:
An exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.ni.dll and wasn't handled before a managed/native boundary
A first chance exception of type 'System.UnauthorizedAccessException' occurred in System.Windows.ni.dll
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况?如何解决这个问题?
看起来您的实际问题是权限,FileNotFound可能由于无法读取文件位置目录而发生异常.
我对Windows Phone开发没有任何经验,但是,我认为在任何地方System.Windows.ni.dll都需要比您运行应用程序更高的权限.
更新
根据您的调用堆栈错误消息 - " 无效的跨线程访问 ",问题是您尝试从另一个不是UI线程的线程访问/更新GUI组件.尝试将代码更改为:
Deployment.Current.Dispatcher.BeginInvoke(()=>
{
Progressor.IsIndeterminate = Progressor.IsVisible = isOn;
if (isOn)
At.Do(delegate { this.set(false); }, 1000);
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7976 次 |
| 最近记录: |