存储具有多个参数的线程-WPF

本文关键字:线程 -WPF 参数 存储 | 更新日期: 2023-09-27 18:00:23

我使用下面的代码运行具有多个参数的线程:

public Thread StartTheThread(System.Windows.Threading.Dispatcher dispatcher, int param1, string param2)
{
    Thread t = new Thread(() => Work(Maingrid.Dispatcher, param1, param2));
    t.Start();
    return t;
}
public delegate void delegate1(Color randomparam, Color secondparam);
public void Work(System.Windows.Threading.Dispatcher dispatcher, int param1, string param2)
{
    dispatcher.Invoke(new delegate1(update), {Color.FromRgb(255, 255, 0),Color.FromRgb(170, 255, 170)});
}
public void update(Color randomparam, Color secondparam)
{
    ...
}

创建新线程通常需要"ThreadStart"或"ParameterizedThreadStart"方法。Threadstart方法适用于没有参数的线程,而parameterizedhreadstart方法适用于只有1个参数(作为对象)的线程。但我有不同类型的参数。由于这些方法是委托,我尝试使用自定义委托来存储线程,以便稍后调用:

public delegate void starterdelegate(System.Windows.Threading.Dispatcher dispatcher, int param1, string param2);
public Thread StartTheThread(int param1, string param2)
{
    Thread t = new Thread(new starterdelegate(RealStart));
    ...
    return t;
}

但在这种情况下,编译器返回以下错误:

"重载解析失败,因为无法使用以下参数调用可访问的"New":"Public Sub New(启动为System.Threading.ParameterizedThreadStart)":"ThreadTraining.MainWindow.starterdelegate"类型的值无法转换为"System.Threading.ParametersizedThreadStart"。"Public Sub New(start As System.Threading.ThreadStart)":"ThreadTraining.MainWindow.starterdelegate"类型的值无法转换为"System.Threading.ThreadStart"。"

我的意思是,运行具有多个参数的线程没有问题,但当我想存储线程t时,我不想提交参数,因为在下次运行线程之前,它们会被更改。若我使用ParameterizedThreadStart方法并且不提交参数,编译器将抛出一个签名错误。若我不使用所需的方法之一,编译器将抛出一个重载解析失败错误

我甚至不知道为什么:

Thread t = new Thread(() => Work(Maingrid.Dispatcher, param1, param2));

工作在第一位。"new Thread"的参数如何与所需的方法兼容?我在这个页面上找到了这行代码:https://stackoverflow.com/a/1195915/2770195

有什么建议吗?

存储具有多个参数的线程-WPF

您可以将参数封装在一个类中,但也可以将逻辑封装在该类中:

public class FooProcessor
{
    private readonly Color _color1;
    private readonly Color _color2;
    public FooProcessor(Color color1, Color color2)
    {
        _color1 = color1;
        _color2 = color2;
    }
    public Task ProcessAsync()
    {
        return Task.Run((Action) Process);
    }
    private void Process()
    {
        //add your logic here
    }
}

OT:如果您没有特定的理由使用Thread而不是Task,请使用Task。一些较旧的教程使用Threads,因为当时Task还不存在。

使用参数化线程启动委托。参考此处:

https://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart(v=vs.110).aspx

我认为您应该创建一个新的类来封装参数,并将新的类实例作为参数发送到线程。

希望得到帮助。

在SO上,有一个关于将多个参数传递给ThreadStart方法的问题的答案。我喜欢这个:

    static void Main(string[] args)
    {
        for (int i = 1; i < 24; i++)
        {
            Thread t = new Thread( ()=>ThreadWorkingStuff(i,"2"+i.ToString() ));
            t.Start();
        }
        Console.ReadKey();
    }
    static void ThreadWorkingStuff(int a, string b)
    {
        Console.WriteLine(string.Format("Thread{2}|  a={0} b={1}", a, b, Thread.CurrentThread.ManagedThreadId));
    }