当前位置:编程学习 > C#/ASP.NET >>

关于【调用线程必须为 STA,因为许多 UI 组件都需要】的问题 实在不知道怎么改了 贴出代码麻烦大神给改一下吧!

【背景介绍】:在网上下载了一个Html to RTF的源码,涉及到WPF。我的程序是winform
在winform一个线程中调用如下代码
string a = HtmlToRtfConverter.ConvertHtmlToRtf(tvalue);

ConvertHtmlToRtf相关代码如下

public static string ConvertHtmlToRtf(string htmlText)
        {
            var xamlText = HtmlToXamlConverter.ConvertHtmlToXaml(htmlText, false);
            
            return ConvertXamlToRtf(xamlText);
        }
        
        private static string ConvertXamlToRtf(string xamlText)
        {
            var richTextBox = new RichTextBox();//运行时此处报错,调用线程必须为 STA,因为许多 UI 组件都需要。

            if (string.IsNullOrEmpty(xamlText)) return "";

            var textRange = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);

            //Create a MemoryStream of the xaml content

            using (var xamlMemoryStream = new MemoryStream())
            {
                using (var xamlStreamWriter = new StreamWriter(xamlMemoryStream))
                {
                    xamlStreamWriter.Write(xamlText);
                    xamlStreamWriter.Flush();
                    xamlMemoryStream.Seek(0, SeekOrigin.Begin);

                    //Load the MemoryStream into TextRange ranging from start to end of RichTextBox.
                    textRange.Load(xamlMemoryStream, DataFormats.Xaml);
                }
            }

            using (var rtfMemoryStream = new MemoryStream())
            {

                textRange = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);
                textRange.Save(rtfMemoryStream, DataFormats.Rtf);
                rtfMemoryStream.Seek(0, SeekOrigin.Begin);
                using (var rtfStreamReader = new StreamReader(rtfMemoryStream))
                {
                    return rtfStreamReader.ReadToEnd();
                }
            }

        }

运行时提示 调用线程必须为 STA,因为许多 UI 组件都需要。
在网上搜了这个问题是WPF的多线程的问题,可是对多线程了解的实在是太少,试了很长时间还是没解决这个问题。

麻烦各位帮忙看下怎么修改呢? WPF 多线程 UI --------------------编程问答-------------------- https://www.google.com.hk/search?q=wpf+dispatcher.begininvoke&aq=0&oq=wpf+dispatcher.begini&aqs=chrome.1.57j0l3j62l2.8428j0&sourceid=chrome&ie=UTF-8 --------------------编程问答-------------------- 在你的线程方法需要更新界面或者打开心窗体的时候Application.Current.Dispatcher.BeginInvoke里执行下更新的代码就好 --------------------编程问答--------------------


 static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]                //此处看你程序是不是STAThread的
        static void Main()
        {
--------------------编程问答--------------------
引用 3 楼 wonderfuly 的回复:


 static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]                //此处看你程序是不是STAThread的
        static void Main()
        {

是多线程调用的,主程序入口肯定是这个了 --------------------编程问答-------------------- 通过委托回调来创建和使用RichTextBox即可。1楼告诉你方法了。 --------------------编程问答-------------------- winform用invoke或者beginInvoke
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,