我从here获取了BlockingCollection的这个例子:
public class PCQueue : IDisposable
{
public delegate void OnFileAddDelegate(string file);
public event OnFileAddDelegate OnFileAddEventHandler;
BlockingCollection<string> _taskQ = new BlockingCollection<string>();
public PCQueue(int workerCount)
{
// Create and start a separate Task for each consumer:
for (int i = 0; i < workerCount; i++)
Task.Factory.StartNew(Consume);
}
public void Dispose()
{
_taskQ.CompleteAdding();
}
public void EnqueueTask(string action)
{
_taskQ.Add(action);
}
void Consume()
{
// This sequence that we’re enumerating will block when no elements
// are available and will end when CompleteAdding is called.
FileChecker fileChecker = new FileChecker();
foreach (string item in _taskQ.GetConsumingEnumerable())
{
string file = item;
string result = fileChecker.Check(file);
if (result != null && OnFileAddEventHandler != null)
OnFileAddEventHandler(result);
}
}
}
我想要做的很简单,我Winforms
申请ListView
所以用户选择了几个文件(PDF文件),我希望这个类存储用户选择的这些文件通过我拥有的另一个类检查这些文件(在每个文件中进行简单搜索)
如果文件正常,我将事件(添加新事件)激活到我的主表单,以便添加此文件。
所以这是我的新Consume
函数和我的文件检查器:
void Consume()
{
// This sequence that we’re enumerating will block when no elements
// are available and will end when CompleteAdding is called.
FileChecker fileChecker = new FileChecker();
foreach (string item in _taskQ.GetConsumingEnumerable())
{
string file = item;
string result = fileChecker.Check(file);
if (result != null && OnFileAddEventHandler != null)
OnFileAddEventHandler(result);
}
}
这是我用户选择要添加的文件后的主要表单,我想将这些文件添加到Queue
中:
string [] files;
PCQueue pq = new PCQueue(1);
pq.OnFileAddEventHandler += pq_OnFileAddEventHandler;
foreach (string item in openFileDialog1.FileNames)
{
string filename = item;
pq.EnqueueTask(filename);
}
private void pq_OnFileAddEventHandler(string file)
{
// Add my file
}
但我有这个错误:无法从'string'转换为'System.Action' 虽然我看到this帖子我无法解决它(我是新开发者)
答案 0 :(得分:0)
您正在定义集合以获取Task对象。由于您的新消费者类处理文件名,只需将其更改为接受字符串(BlockingCollection<string>
),并相应地重新编写其余代码。 (foreach (string filename in _taskQ.GetConsumingEnumerable())
)等。