2012-05-21 68 views
1

我有一个关于线程在Silverlight中的问题。我主要来自一个WinForms背景,通常使用以下包装类做我的线程:

http://msdn.microsoft.com/en-us/magazine/cc163644.aspx

它做窗口发展的工作,但我不能在Silverlight中使用它。原因是因为ExecutionContext标记为[SecurityCritical]属性,导致无法从Silverlight调用。

Silverlight中是否有类似的包装类,或者有没有办法解决这个问题?Silverlight线程池

谢谢!

回答

1

即使在WinForm应用程序中,我也不会使用您引用的类。它仍然使用Thread.Abort,它可以(也可能会)破坏应用程序域。相反,请在任务并行库中使用新的Cancellation机制。尽管如此,您将不得不重新考虑取消工作项目的整个方法。这是因为您不能再依靠强制终止,而必须使用合作终止。优点是后者可以保证避免破坏应用程序域。

+0

不知道新的取消机制。我得看一看。 – Toad

+0

这将有助于取消一个线程,但我该如何处理ExecutionContext问题? – Toad

+0

@Toad:除了因为它是您引用的包装类的一部分,您是否有任何理由使用它?如果没有,那么我的建议是停止使用它。 –

0

查看仅在SL5中可用的取消令牌(通过CancellationTokenSource)。它使用类似MSDN mag ref中使用的机制。

这是一个good 'how-to' article。一些MSDN References here以及a lengthy but great article here

一切都好,欢迎来到XAML编程:)你不会回头看!

+0

这将有助于取消一个线程,但我该如何处理ExecutionContext问题? – Toad

+0

见上文,Brian的评论总结得很完美 - TPL不需要ExecutionContext。 _它不会发生在不安全的线程池操作(如UnsafeQueueUserWorkItem方法),它不会传输压缩堆栈。无论压缩堆栈在哪里流动,托管主体,同步,区域设置和用户上下文也都会流动._从[MSDN](http://msdn.microsoft.com/zh-cn/library/system.threading.executioncontext.aspx) – leon

0

重写使用“任务”(Task Link)或BackgroundWorker(BackgroundWorker Link)的现有代码。

我们应该使用最新的技术,这给了我们一个技术发展。