泛型匿名委托问题,图一可以实现,图二想换个写法就无法实现功能了,求指导

adam_gin 2019-05-20 10:37:53
图一:


图二:
...全文
168 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bloodish 2019-05-22
  • 打赏
  • 举报
回复
Invoke的Delegate参数需要有明确的委托类型,没法直接用Lambda,需要强制类型转换

Invoke((Action)(() => { }));
Invoke((EventHandler)((s,e) => { }));
  • 打赏
  • 举报
回复
引用 6 楼 adam_gin 的回复:
[quote=引用 5 楼 懒懒懒源 的回复:]

        private int n = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            Task.Factory.StartNew(() =>
            {
                for (var i = 0; i < 101; i++)
                {
                    n = i;
                    Invoke(new Action<int>(doNothing), n);
                }
            });
        }

        void doNothing(int i)
        {
            progressBar1.Value = i;
        }
Invoke(new Action<int>(doNothing), n); 这样写测试通过,请问下这句可以换成lambda表达式吗?[/quote] 你是说方法和参数不分开?

            Task.Factory.StartNew(() =>
            {
                for (var i = 0; i < 101; i++)
                {
                    n = i;
                    Invoke(new EventHandler(delegate
                    {
                        doNothing(n);
                    }));
                }
            });
adam_gin 2019-05-22
  • 打赏
  • 举报
回复
引用 5 楼 懒懒懒源 的回复:

private int n = 0;
private void button1_Click(object sender, EventArgs e)
{
Task.Factory.StartNew(() =>
{
for (var i = 0; i < 101; i++)
{
n = i;
Invoke(new Action<int>(doNothing), n);
}
});
}

void doNothing(int i)
{
progressBar1.Value = i;
}


Invoke(new Action<int>(doNothing), n); 这样写测试通过,请问下这句可以换成lambda表达式吗?
  • 打赏
  • 举报
回复

        private int n = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            Task.Factory.StartNew(() =>
            {
                for (var i = 0; i < 101; i++)
                {
                    n = i;
                    Invoke(new Action<int>(doNothing), n);
                }
            });
        }

        void doNothing(int i)
        {
            progressBar1.Value = i;
        }
秋的红果实 2019-05-20
  • 打赏
  • 举报
回复

private void doNothing(int j)
{
    Thread.Sleep(200);
    progressBar1.Invoke(new Action(() => progressBar1.Value = j));
    
}

Task task = Task.Factory.StartNew(() =>
  {
      for(int i=0;i<101;i++)
      {
          doNothing(i);

      }
  });

测试通过
秋的红果实 2019-05-20
  • 打赏
  • 举报
回复
图1里面,()=>progressBar1.Value=i;等效于图二的doNothing(n) 写成:

...new Action(doNothing(n));

stherix 2019-05-20
  • 打赏
  • 举报
回复
因为Control.Invoke只能调用无参数的Action 你可以这么写 Invoke(new Action(() => DoNothing(n)));
adam_gin 2019-05-20
  • 打赏
  • 举报
回复
引用 1 楼 秋的红果实 的回复:
图1里面,()=>progressBar1.Value=i;等效于图二的doNothing(n)
写成:

...new Action(doNothing(n));



这样写不行吧

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧