代码之家  ›  专栏  ›  技术社区  ›  ANaimi

无法在Silverlight中终止工作线程

  •  4
  • ANaimi  · 技术社区  · 15 年前

    我正在开发一个多线程的Silverlight应用程序。

    该应用程序有两个线程:Main/UI和一个后台工作线程。

    UI线程应该能够杀死后台线程,如下所示:

    private Thread executionThread;
    
    ....
    
    executionThread = new Thread(ExecuteStart);
    executionThread.Start();
    
    ....
    
    executionThread.Abort(); // when the user clicks "Stop"
    

    最后一行引发了一个异常:

    MethodAccessException:尝试访问方法失败:System.Threading.Thread.Abort()

    有什么想法吗?为什么我不能在Silverlight中中止线程?

    谢谢 奈米

    3 回复  |  直到 15 年前
        1
  •  6
  •   Peter McG    15 年前

    而不是手动创建线程为此目的,您可能需要考虑使用 BackgroundWorker

    此类具有内置功能,用于在WorkerSupportsCancellation=true时取消异步操作。

    请阅读MSDN上的这篇文章,了解更多信息 full example 如何在Silverlight中使用BackgroundWorker。

        2
  •  4
  •   Davy Landman    15 年前

    这是有记录的,见 Thread.Abort()

    SecurityCriticalAttribute属性, 这就限制了它的内部使用 Silverlight的.NET框架 类库。应用程序代码 使用此成员抛出 MethodAccessException。

    ManualResetEvent (线程安全通信方法)向后台线程发送停止信号。

    后台线程中的示例代码:

    if (!shouldStop.WaitOne(0)) 
    // you could also sleep 5 seconds by using 5000, but still be stopped 
    // after just 2 seconds by the other thread.
    {
        // do thread stuff
    }
    else
    {
        // do cleanup stuff and exit thread.
    }
    
        3
  •  0
  •   Scofield Scofield    15 年前

    正如Davy所指出的,由于Silverlight代码是通过互联网传输的,所以它通常不受信任,而且它的执行受到更多的限制。 相反,在类中实现一个布尔退出标志,该标志对于后台线程来说是规范的,这样您就可以提升该标志并改用thread.Join()。