C# 异步运行同步方法
我正在尝试异步运行一个同步方法,以便可以用它的进度更新UI。我必须用几个不同的数据段运行同一个同步方法,但一次只能有一个该方法的实例 这就是我尝试过的,这并不完全是我的程序的样子,但我已经对它进行了简化,以尽量减少混乱C# 异步运行同步方法,c#,C#,我正在尝试异步运行一个同步方法,以便可以用它的进度更新UI。我必须用几个不同的数据段运行同一个同步方法,但一次只能有一个该方法的实例 这就是我尝试过的,这并不完全是我的程序的样子,但我已经对它进行了简化,以尽量减少混乱 class Program { static int[] data = new int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; static void Main(string[] args)
class Program
{
static int[] data = new int[10]
{
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
};
static void Main(string[] args)
{
Method(0);
}
static void Method(int parameter)
{
if (parameter < data.Length)
{
Worker worker = new Worker();
worker.OnProgressChange += delegate
{
// Update UI
};
worker.OnWorkComplete += delegate
{
Method(parameter++);
};
worker.DoWork();
}
}
}
class Worker
{
public event EventHandler OnProgressChange;
public event EventHandler OnWorkComplete;
public Worker() { }
public void DoWork() { }
}
类程序
{
静态整数[]数据=新整数[10]
{
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
};
静态void Main(字符串[]参数)
{
方法(0);
}
静态无效方法(int参数)
{
if(参数<数据长度)
{
工人=新工人();
worker.OnProgressChange+=委托
{
//更新用户界面
};
worker.OnWorkComplete+=委托
{
方法(参数++);
};
工人。道工();
}
}
}
班主任
{
公共事件事件处理程序OnProgressChange;
公共事件事件处理程序OnWorkComplete;
公职人员(){}
public void DoWork(){}
}
我不知道如何攻击它。如果我没有很好地解释这个问题,请告诉我。.NET已经为您做了:
基本上,您所需要做的就是更改方法参数以限制BackgroundWorker
(对象发送器,DoWorkEventArgs e)
和调用RunWorkAsync
好的,我找到了一个解决方案!答案不适用于我上面介绍的抽象场景,但想法是一样的
private bool flag = false;
private void CheckCompletion()
{
// Do stuff
ConvertFiles();
while (!flag)
Application.DoEvents();
// Do more stuff
}
private void ConvertFiles()
{
UpdateStatus("Converting...", true);
Task.Factory.StartNew(() =>
{
using (Engine engine = new Engine())
{
for (int i = 0; i < entries.Count; i++)
{
MediaFile inputFile = new MediaFile(entries[i].FilePath);
MediaFile outputFile = new MediaFile(entries[i].FilePath.Replace(".aac", ".mp3"));
engine.ConvertProgressEvent += (obj, args) =>
{
int value = (int)Math.Round(args.ProcessedDuration.TotalSeconds /
args.TotalDuration.TotalSeconds);
Invoke(new Action(delegate { entries[i].ProgressBarEx.Value = value; }));
};
engine.Convert(inputFile, outputFile);
}
}
flag = true;
});
}
private bool标志=false;
私有无效检查完成()
{
//做事
转换文件();
while(!flag)
Application.DoEvents();
//多做事
}
私有文件()
{
UpdateStatus(“转换…”,真);
Task.Factory.StartNew(()=>
{
使用(发动机=新发动机())
{
for(int i=0;i
{
int值=(int)Math.Round(args.ProcessedDuration.TotalSeconds/
args.TotalDuration.TotalSeconds);
调用(新操作(委托{entries[i].ProgressBarEx.Value=Value;}));
};
转换(输入文件,输出文件);
}
}
flag=true;
});
}
如果需要异步运行同步方法,请使用任务并行库。如果您需要运行该异步运行的同步任务的多个实例,但一次只运行一个实例,请在该任务内放置一个for循环
,并使用bool
变量告知应用程序所有任务何时完成。它是while(!flag)应用程序.DoEvents()的这就是纯粹的魔法
很抱歉,如果我说的任何内容太让人困惑。包含代码示例(Fibonacci更好:)谢谢,但我知道如何异步运行同步方法。我需要做的是异步多次同步运行同步方法。哈哈哈,如果你明白我的意思的话。这看起来不是一个好方法。您有一个紧凑的while
循环,它将不断地获得时间片,以向系统屈服。NET提供了更好的内置方法来解决这个问题。@mbeckish我不能说这是一个好方法。但这是我能想出的唯一办法。如果你有更好的主意,请告诉我!我问这个问题的原因不仅仅是为了找到一种方法,而是为了确保我实施的方法是一种好方法。我不理解你的问题,但我认为你的回答说明了你正在努力实现的目标。您希望执行一些繁重的处理(转换文件集合),这将需要一些时间才能完成。您希望应用程序的执行线程被暂停,直到文件处理完成,但希望Windows能够响应。是这样吗?@mbeckish我希望UI线程处于活动状态且不冻结。考虑到这一点,我试图转换一个文件列表,但一次只能转换一个文件。这就是我想做的。