【问题标题】:Access to Thread parameter [duplicate]访问线程参数[重复]
【发布时间】:2020-07-12 20:00:16
【问题描述】:
internal static class RtfMerger
    {
        static object lockRtf = new object();
        static RichTextBox richTextBox1 = new RichTextBox();

        static TaskCompletionSource<string> source = new TaskCompletionSource<string>();
        static Thread thread = new Thread(() =>
        {
             //SOME code...
            // HOW TO THERE ACCESS TO THE PARAMETER input ?

        });

        public static Task<string> MergeRtf(params string[] input)
        {
            lock (lockRtf)
            {                               
                thread.SetApartmentState(ApartmentState.STA);
                thread.Start();  // <- HERE I CAN PASS input
                return source.Task;
            }
        }

您好,如何修改线程的声明,使其可以接收参数字符串[]输入?

并且有完整的类和相关的方法。希望能帮助到你 因为我担心了很久不知道怎么办 因为我担心了很久,不知道该怎么办

{
    internal static class RtfMerger
    {
        static object lockRtf = new object();
        static RichTextBox richTextBox1 = new RichTextBox();

        static TaskCompletionSource<string> source = new TaskCompletionSource<string>();
        static Thread thread = new Thread(() =>
        {
            try
            {
                //var richTextBox1 = new RichTextBox(); //TODO static na úrovni třídy [LOCK] //TODO async
                if (input != null && input.Length > 0)
                {
                    if (input[0].StartsWith(@"{\rtf"))
                    {
                        richTextBox1.Rtf = input[0];
                    }
                    else
                    {
                        richTextBox1.Rtf = ConvertPlainTextToRTF(input[0], "Arial");
                    }
                    richTextBox1.AppendText("\r\n");
                    for (int i = 1; i < input.Length; i++)
                    {
                        richTextBox1.SelectionStart = richTextBox1.TextLength;
                        richTextBox1.SelectionLength = 0;

                        if (input[i].StartsWith(@"{\rtf"))
                        {
                            richTextBox1.SelectedRtf = input[i];
                        }
                        else
                        {
                            richTextBox1.SelectedRtf = ConvertPlainTextToRTF(input[i], "Arial");
                        }
                    }
                }
                source.SetResult(richTextBox1.Rtf);
            }
            catch (Exception ex)
            {
                source.SetException(ex);
            }

        });

        public static Task<string> MergeRtf(params string[] input)
        {
            lock (lockRtf)
            {               
                //TODO přidat synchronizační objekt (může být 
                thread.SetApartmentState(ApartmentState.STA);
                thread.Start(); //Přidat zámek k spuštění threadu
                return source.Task;
            }
        }


    }
}

【问题讨论】:

  • 有没有办法,如何在不创建其他方法的情况下做到这一点?
  • 静态线程 thread = new Thread(() => { //CODE });在这种类型的注册中
  • "如何在不创建其他方法的情况下做到这一点?" -- stackoverflow.com/a/3360586

标签: c# multithreading


【解决方案1】:

你当然可以这样做:

internal static class RtfMerger
{
    static object lockRtf = new object();

    static TaskCompletionSource<string> source = new TaskCompletionSource<string>();

    public static Task<string> MergeRtf(params string[] input)
    {
        lock (lockRtf)
        {
            Thread thread = new Thread(() =>
            {
                //SOME code...

                // You can access `input` here.
            });
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
            return source.Task;
        }
    }
}

【讨论】:

  • 我无法使用静态 RichTextBox richTextBox1 = new RichTextBox();得到异常
  • 是的,我需要在类中声明为静态
  • @SonDy - 当然,不要使用它。您提供的代码中不需要它,并且您没有在问题中提及它,所以我将其省略了。
  • @SonDy - 而且,即使您确实使用了RichTextBox,您也无法在用于创建它的线程之外的线程中访问或更新它。
  • @SonDy - 你需要让我们知道 //SOME code... 想要做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多