我在点击按钮时调用的方法很少。
泛函()
functionB()
functionC()
这三个功能彼此独立,需要很长时间才能执行。我检查并发现通过线程我可以一起运行所有这三个,这将节省执行时间。
由于我是线程概念的新手,任何人都可以指导我在场景中以其他方式进行线程化的最简单方法,这将在这种情况下有用。
修改
同一功能中的另一个问题:
我在三个函数执行后绑定了5个gridviews。喜欢这个
gv1.DataSource = GetData("Mill");
gv1.DataBind();
gv2.DataSource = GetData("Factory");
gv2.DataBind();
gv3.DataSource = GetData("Garage");
gv3.DataBind();
gv4.DataSource = GetData("Master");
gv4.DataBind();
他们都使用相同的方法来获得结果,他们也花时间加载。有什么办法我可以并行运行它们吗?我担心,因为他们使用相同的方法来获取数据。是否可以为它们进行线程化。怎么样?
答案 0 :(得分:1)
我不确定Parallel.Invoke()如何决定并行执行什么,但如果你想确保它们将并行执行,请使用线程:
var t1 = new Thread(MySlowFunction);
t1.IsBackground = true;
t1.Start();
var t2 = new Thread(MySlowFunction);
t2.IsBackground = true;
t2.Start();
# To resync after completion:
t1.Join();
t2.Join();
甚至更好,使用ThreadPool:
ThreadPool.QueueUserWorkItem(MyWork);
请记住处理您的线程例外。
答案 1 :(得分:0)
最简单的答案是使用MSDN: Parallel.Invoke()。
您还应该考虑:Asynchronous Pages。
答案 2 :(得分:0)
尝试使用System.Threading.Tasks命名空间
像
这样的东西var task1 = Task.Factory.StartNew(() => DoA());
var task2 = Task.Factory.StartNew(() => DoB());
var task3 = Task.Factory.StartNew(() => DoC());
Task.WaitAll(task1, task2, task3);
答案 3 :(得分:0)
这是一个将并行执行4个任务的例子:
public partial class _Default : System.Web.UI.Page
{
public class MyViewModel
{
public int Id { get; set; }
public string Name { get; set; }
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void BtnBindClick(object sender, EventArgs e)
{
// we define the input for the tasks: each element consists
// of the grid we are willing to bind the results at the end and
// some optional parameter we want to pass to the GetData function
var inputs = new[]
{
new { Grid = gv1, Input = "Mill" },
new { Grid = gv2, Input = "Factory" },
new { Grid = gv3, Input = "Garage" },
new { Grid = gv4, Input = "Master" },
};
// define the tasks we want to execute in parallel
var tasks = inputs
.Select(x => Task.Factory.StartNew(
() => new { Grid = x.Grid, Output = GetData(x.Input) })
)
.ToArray();
// define a task which will be executed once all tasks have finished
var finalTask = Task.Factory.ContinueWhenAll(tasks, x => x);
// wait for the final task
finalTask.Wait();
// consume the results
foreach (var item in finalTask.Result)
{
if (item.Exception == null)
{
// if no exception was thrown for this task we could bind the results
item.Result.Grid.DataSource = item.Result.Output;
item.Result.Grid.DataBind();
}
}
}
private MyViewModel[] GetData(string input)
{
// Simulate slowness
Thread.Sleep(1000);
return Enumerable.Range(1, 5).Select(x => new MyViewModel
{
Id = x,
Name = input
}).ToArray();
}
}