Threading for methods on button click

筅森魡賤 提交于 2019-12-08 05:52:19

问题


I am calling few methods on a button click.

functionA()

functionB()

functionC()

All three functions are independent from each other and they take long time to execute. I checked and found that by threading I can run all three together which will save the execution time.

As I am new to threading concept, could anyone please guide me the simplest way I can do threading in scenario or other way which will be useful in this scenario.

EDIT

One more problem in the same function:

I am binding 5 gridviews after the three functions execution. Like this

            gv1.DataSource = GetData("Mill");
            gv1.DataBind();

            gv2.DataSource = GetData("Factory");
            gv2.DataBind();

            gv3.DataSource = GetData("Garage");
            gv3.DataBind();

            gv4.DataSource = GetData("Master");
            gv4.DataBind();

They all are using the same method for getting the result and they are also taking time to load. Is there any way I can run them parallel too? I afraid, because they are using same method to get the data. Is it possible to do threading for them. How ?


回答1:


I am not sure how Parallel.Invoke() decides what to execute in parallel, but if you want an assurance that they will execute in parallel, use threads:

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

Or even better, use the ThreadPool:

  ThreadPool.QueueUserWorkItem(MyWork);

Remember to handle your thread exceptions.




回答2:


The simplest answer is to use MSDN: Parallel.Invoke().

You should also consider: Asynchronous Pages.




回答3:


Try using System.Threading.Tasks namespace

Something like

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




回答4:


Here's an example which will execute the 4 tasks in parallel:

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


来源:https://stackoverflow.com/questions/7839001/threading-for-methods-on-button-click

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!