【问题标题】:Sending parameter error in c#在c#中发送参数错误
【发布时间】:2018-03-06 17:35:11
【问题描述】:

我用 c# 编写了以下代码,经过多次尝试后,我仍然在注释行中遇到同样的错误

错误消息:“需要方法名”

所以请您告诉我为我的 LoadSpeceficSontrol 函数发送“tmp”变量的适当方式。 提前感谢任何帮助。

 private void AddBox()
    {
        Thread thread= new Thread(() => LoadControls());
        thread.Start();
    }

    delegate void LoadControlsCallback();

    private void LoadControls()
    {
        int Nu = int.Parse(PageNumber.Text);
        for (int i = (Nu - 1) * 100; i < Nu * 200 && i < MoviesList.Count; i++)
        {
            MovieControl tmp = new MovieControl(MoviesList[i]);
            if (tmp.InvokeRequired || MoviesFlowPanel.InvokeRequired)
            {
                LoadControlsCallback d = new LoadControlsCallback(LoadSpeceficControl, new object[] {tmp}); // error here
                this.Invoke(d);
            }
            else
            MoviesFlowPanel.Controls.Add(tmp);
        }
    }

    private void LoadSpeceficControl(MovieControl tmp)
    {
        MoviesFlowPanel.Controls.Add(tmp);   
    }

代码版本 2.0

private void AddBox()
{
    Thread thread= new Thread(() => LoadControls());
    thread.Start();
}

private void LoadControls()
{
    int Nu = int.Parse(PageNumber.Text);
    for (int i = (Nu - 1) * 100; i < Nu * 200 && i < MoviesList.Count; i++)
    {
        MovieControl tmp = new MovieControl(MoviesList[i]);
        if (tmp.InvokeRequired || MoviesFlowPanel.InvokeRequired)
        {
            this.Invoke((MethodInvoker)delegate { MoviesFlowPanel.Controls.Add(tmp); });
        }
        else 
        MoviesFlowPanel.Controls.Add(tmp);
        tmp = null;
    }
}

【问题讨论】:

  • 有人可以帮我吗?
  • this.Invoke(d); 是类的调用方法部分
  • @RahulAgarwal 这有点神秘,你有什么建议吗?如何解决这个问题
  • 让我看看..
  • 使用asunc/awaitTask.Run 代替原始线程并尝试用Invoke 编组对UI 线程的调用。

标签: c# multithreading c#-4.0 parameters thread-safety


【解决方案1】:

应该是这样的:

delegate void LoadControlsCallback(MovieControl tmp);

LoadControlsCallback d = LoadSpeceficControl;
d(tmp);

【讨论】:

  • 谢谢,代码运行了,但是有一个小问题你能帮我解决一下吗,不会超过 1 分钟
  • 太棒了。如果您认为这是解决问题的方法,请接受答案。你还有什么问题?
  • 我已经编辑了你可以看到 2.0 版本的代码,所以我的代码所做的是将电影控件添加到我的流布局面板,但它添加了两次相同的电影。如何解决这个问题(注意;我检查了包含电影的列表,它很好,在我使用线程之前它工作正常)。最后,我是否需要停止线程或其他任何东西来释放 Ram。非常感谢您对我的帮助!
  • 修复发生了什么?
  • 你有没有单步检查你的代码,看看它何时被添加了两次以及为什么?
【解决方案2】:

LoadControlsCallback 的委托定义应与签名匹配。就像你的使用方式一样,它应该是这样的:

delegate void LoadControlsCallback(Action<MovieControl> action, object[] objarray);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 2011-07-20
    相关资源
    最近更新 更多