Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 访问线程参数_C#_Multithreading - Fatal编程技术网

C# 访问线程参数

C# 访问线程参数,c#,multithreading,C#,Multithreading,您好,如何修改线程的声明,即它可以接收参数字符串[]输入 并且有一个完整的类和相关的方法。希望能有帮助 因为我已经担心很长时间了,我不知道该怎么办 因为我已经担心很长时间了,我不知道该怎么办 internal static class RtfMerger { static object lockRtf = new object(); static RichTextBox richTextBox1 = new RichTextBox();

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

并且有一个完整的类和相关的方法。希望能有帮助 因为我已经担心很长时间了,我不知道该怎么办 因为我已经担心很长时间了,我不知道该怎么办

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;
            }
        }


    }
}

另请参见是否有一种方法,如何在不创建另一个方法的情况下执行此操作?静态线程线程=新线程=>{//CODE};在这种类型的注册中,如何在不创建其他方法的情况下执行此操作?-我无法使用静态RichTextBox RichTextBox 1=新的RichTextBox;获取异常,我需要在中声明为静态class@SonDy-当然,那就别用了。您提供的代码中不需要它,您在问题中也没有提到它,所以我将其忽略。@SonDy-而且,即使您使用了RichTextBox,您也不能在创建它的线程之外的线程中访问或更新它。@SonDy-您需要让我们知道//一些代码。。。他正在努力。
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;
        }
    }
}