我有windows form app这是我的代码:
private async void btnGo_Click(object sender, EventArgs e)
{
Progress<string> labelVal = new Progress<string>(a => labelValue.Text = a);
Progress<int> progressPercentage = new Progress<int>(b => progressBar1.Value = b);
// MakeActionAsync(labelVal, progressPercentage);
await Task.Factory.StartNew(()=>MakeActionAsync(labelVal,progressPercentage));
MessageBox.Show("Action completed");
}
private void MakeActionAsync(Progress<string> labelVal, Progress<int> progressPercentage)
{
int numberOfIterations=1000;
for(int i=0;i<numberOfIterations;i++)
{
Thread.Sleep(10);
labelVal.Report(i.ToString());
progressPercentage.Report(i*100/numberOfIterations+1);
}
}
我得到编译错误“System.Progress”不包含“Report”的定义,并且没有扩展方法“Report”接受类型为“System.Progress”的第一个参数可以找到(你是否缺少using指令或汇编参考?)“
但 如果你看一下Progress class:
public class Progress<T> : IProgress<T>
并且接口IProgress具有功能报告:
public interface IProgress<in T>
{
// Summary:
// Reports a progress update.
//
// Parameters:
// value:
// The value of the updated progress.
void Report(T value);
}
我缺少什么?
答案 0 :(得分:18)
Progress<T>
使用explicit interface implementation实施了该方法。因此,您无法使用Report
类型的实例访问Progress<T>
方法。您需要将其强制转换为IProgress<T>
才能使用Report
。
只需将声明更改为IProgress<T>
IProgress<int> progressPercentage = new Progress<int>(b => progressBar1.Value = b);
或使用演员
((IProgress<int>)progressPercentage).Report(i*100/numberOfIterations+1);
我更喜欢以前的版本,后者很尴尬。
答案 1 :(得分:2)
如documentation所示,该方法是使用显式接口实现实现的。这意味着如果您不使用该接口来访问该方法,它将被隐藏。
显式接口实现用于在引用接口时使某些属性和方法可见,但在任何派生类中都不可见。因此,当您使用IProgress<T>
作为变量类型时,您只能'看到'它们,但在使用Progress<T>
时则不会。“
试试这个:
((IProgress<string>)progressPercentage).Report(i*100/numberOfIterations+1);
或者当您只需要引用接口声明中可用的属性和方法时:
IProgress<string> progressPercentage = ...;
progressPercentage.Report(i*100/numberOfIterations+1);