按钮点击方法的线程

时间:2011-10-20 16:16:35

标签: asp.net multithreading function asp.net-4.0

我在点击按钮时调用的方法很少。

泛函()

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();

他们都使用相同的方法来获得结果,他们也花时间加载。有什么办法我可以并行运行它们吗?我担心,因为他们使用相同的方法来获取数据。是否可以为它们进行线程化。怎么样?

4 个答案:

答案 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);

http://www.codethinked.com/net-40-and-systemthreadingtasks

答案 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();
    }
}