Функции потока C # - PullRequest
       29

Функции потока C #

3 голосов
/ 21 августа 2009

Могу ли я сделать любую функцию, как

public void myfunc()
{
   //some processing
}

функция потока

Thread t = new Thread (new ThreadStart (myfunc));

тогда где-то

t.Start();

и могу ли я передать какие-либо аргументы этому типу?

Ответы [ 3 ]

7 голосов
/ 21 августа 2009

Существует перегрузка, которая принимает состояние объекта - однако, IMO, самый простой способ передать произвольные аргументы потоку запуска (и проверить подпись во время компиляции) с помощью анонимного метода:

int a = ...
string b = ...
Thread t = new Thread (delegate() { SomeFunction(a,b);});

Просто (и это важно ) - * не меняйте a или b после этого, так как изменение будет отражено в потоке (как раса) - т.е. не сделать:

int a = ...
string b = ...
Thread t = new Thread (delegate() { SomeFunction(a,b);});
a = 12; // this change will be visible to the anonymous method - be careful ;-p

В случае циклов важно (при работе с асинхронными и захваченными переменными) вводить дополнительные переменные для этого; это очень разные

    int[] data = {1,2,3,4,5};
    foreach(int i in data) {
        ThreadPool.QueueUserWorkItem(delegate {
            Console.WriteLine(i); });
    }
    Console.ReadLine();

(который, вероятно, напечатает 5,5,5,5,5)

    int[] data = {1,2,3,4,5};
    foreach (int i in data) {
        int tmp = i;
        ThreadPool.QueueUserWorkItem(delegate {
            Console.WriteLine(tmp); });
    }
    Console.ReadLine();

(который печатает 1-5 в произвольном порядке)


Обновление, чтобы обсудить точку зрения Миэ (комментарии); что означает этот отпечаток (99,999% времени - есть состояние гонки)?

    string s = "dreams";
    ThreadPool.QueueUserWorkItem(delegate {
        Console.WriteLine(s);
    });
    s = "reality";
    Console.ReadLine();
6 голосов
/ 21 августа 2009

Теоретически вы можете заставить любой метод выполняться в отдельном потоке, если вы следуете некоторым правилам (например, синхронизация, вызов делегатов для обновления пользовательского интерфейса и т. Д.).

Из вашего вопроса я понимаю, что у вас нет большого опыта в многопоточном программировании, поэтому я советую вам много прочитать о многопоточности и узнать об опасностях и проблемах, которые могут возникнуть. Вы также можете использовать фоновый рабочий класс, который берет на себя некоторые обязанности.

Кроме того, да, вы можете передавать параметры в метод потока:

private class ThreadParameters
{
   ....
}

...

public void ThreadFunc(object state)
{
    ThreadParameters params = (ThreadParameters)state;
    ....
}

Thread t = new Thread(new ParameterizedThreadStart(ThreadFunc));
t.Start(new ThreadParameters() { ... });
1 голос
/ 01 августа 2011
protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["intCompany_Accounting_Year_ID"] == null || Session["vcrAdmin_Id"] == null)
        {
            Response.Redirect("User_Login.aspx");
        }

        if (!IsPostBack)
        {
            ViewState["Page_Index"] =  Request.QueryString["Page_Index"];
            ViewState["ID_Field"] = Request.QueryString["ID_Field"];
            Initialize_Page();                
            Bind_Search_Grid();                
        }
    }
    protected void btnFind_Click(object sender, EventArgs e)
    {
        Bind_Search_Grid();
    }                               




protected void grdSearch_Result_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.Header)
    {
        Label lblHeader = (Label)e.Row.FindControl("lblHeader");
        lblHeader.Text = ViewState["Header_Name"].ToString();
    }
    else if (e.Row.RowType == DataControlRowType.DataRow)
    {
        LinkButton lnk = (LinkButton)e.Row.FindControl("lnkDisplay_Text");
        lnk.OnClientClick = "Close_Window('" + lnk.CommandArgument + "','" + ViewState["ID_Field"].ToString() 
            + "')";
    }

}
protected void grdSearch_Result_RowCreated(object sender, GridViewRowEventArgs e)
{
    e.Row.Cells[1].Visible = false;
    e.Row.Cells[2].Visible = false;
    e.Row.Cells[3].Visible = false;
}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...