Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程池中没有用于执行操作的可用线程。异步方法更新用户界面_C#_Multithreading_Winforms_C# 4.0 - Fatal编程技术网

C# 线程池中没有用于执行操作的可用线程。异步方法更新用户界面

C# 线程池中没有用于执行操作的可用线程。异步方法更新用户界面,c#,multithreading,winforms,c#-4.0,C#,Multithreading,Winforms,C# 4.0,我是在多线程环境中开发Win Forms应用程序的新手。请在下面的场景中提供帮助。我想要一个简单的方法来解决这个问题,如果DataGrid不适合这个场景,我准备更改我的控制 我正在从多个线程(异步操作)调用一个方法,该方法在WinForms应用程序的DataGrid中添加数据。调用此方法后,线程不会立即退出。由于UI正在阻止所有线程,所以我得到一个异常“线程池中没有用于执行操作的空闲线程” 对于少量的螺纹,其工作良好。但是当我剪掉它的时候,比如说1000条线。UI没有响应,我遇到异常 publi

我是在多线程环境中开发Win Forms应用程序的新手。请在下面的场景中提供帮助。我想要一个简单的方法来解决这个问题,如果DataGrid不适合这个场景,我准备更改我的控制

我正在从多个线程(异步操作)调用一个方法,该方法在WinForms应用程序的DataGrid中添加数据。调用此方法后,线程不会立即退出。由于UI正在阻止所有线程,所以我得到一个异常“线程池中没有用于执行操作的空闲线程”

对于少量的螺纹,其工作良好。但是当我剪掉它的时候,比如说1000条线。UI没有响应,我遇到异常

public static void PostAsync(string url, Object postParameters,
      Action<HttpWebRequestCallbackState> responseCallback, object state,
      string contentType = "application/json")
publicstaticvoidpostasync(字符串url、对象后参数、,
操作响应回调,对象状态,
字符串contentType=“应用程序/json”)
//获取要在UI上显示的必需参数,并将其传递给AsyncDelegate中的Assert方法

HttpSocket.PostAsync(URL, requestData, callbackState =>
                {
                    try
                    {
                        if (callbackState.Exception != null)
                            throw callbackState.Exception;
                        String response = HttpSocket.GetResponseText(callbackState.ResponseStream);


                        Assert(expectedData, responseObj, methodName + TrimFileName(requestInfo[1].ToString()), duration, err);
                        File.WriteAllText(responceJsonFilePath, response);
                    }
                    catch (Exception e)
                    {
                        String err = e.Message.ToString();
                        TimeSpan duration = new TimeSpan(0, 0, 0);
                        List<Object> requestInfo = callbackState.State as List<Object>;
                        String methodName = System.Reflection.MethodInfo.GetCurrentMethod().Name.Split(new char[] { '<', '>' })[1];
                        Assert(null, "Exception", methodName + TrimFileName(requestInfo[1].ToString()), duration, err);
                    }


// Assert Method calls refreshResult after performing some comparison

public static void refreshResult(string text, string testMethod, TimeSpan duration, String err)
    {
        JSONTest form = (JSONTest)Application.OpenForms["JSONTest"];
        if (form.GridTestReport.InvokeRequired)
        {
            refreshCallback d = new refreshCallback(refreshResult);
            form.Invoke(d, new object[] { text, testMethod, duration, err });
        }
        else
        {
            form.GridTestReport_resultTable.Rows.Add(testMethod, text, duration, err);
            form.GridTestReport.Refresh();
            if (text == "FAIL")
            {
                form.GridTestReport.Rows[form.GridTestReport.RowCount - 1].DefaultCellStyle.ForeColor = Color.Red;
            }
            else if (text == "PASS")
            {
                form.GridTestReport.Rows[form.GridTestReport.RowCount - 1].DefaultCellStyle.ForeColor = Color.Green;
            }
        }
    }
HttpSocket.PostAsync(URL、requestData、callbackState=>
{
尝试
{
if(callbackState.Exception!=null)
抛出callbackState.Exception;
String response=HttpSocket.GetResponseText(callbackState.ResponseStream);
断言(expectedData,responseObj,methodName+TrimFileName(requestInfo[1].ToString()),持续时间,错误);
writealText(responceJsonFilePath,response);
}
捕获(例外e)
{
字符串err=e.Message.ToString();
TimeSpan持续时间=新的TimeSpan(0,0,0);
List requestInfo=callbackState.State为List;
String methodName=System.Reflection.MethodInfo.GetCurrentMethod().Name.Split(新字符[]{''})[1];
断言(null,“异常”,methodName+TrimFileName(requestInfo[1].ToString()),持续时间,错误);
}
//Assert方法在执行一些比较后调用refreshResult
公共静态无效刷新结果(字符串文本、字符串测试方法、时间跨度持续时间、字符串错误)
{
JSONTest form=(JSONTest)Application.OpenForms[“JSONTest”];
if(form.GridTestReport.invokererequired)
{
refreshCallback d=新的refreshCallback(refreshResult);
Invoke(d,新对象[]{text,testMethod,duration,err});
}
其他的
{
form.GridTestReport\u resultTable.Rows.Add(testMethod、text、duration、err);
form.GridTestReport.Refresh();
如果(文本==“失败”)
{
form.GridTestReport.Rows[form.GridTestReport.RowCount-1].DefaultCellStyle.ForeColor=Color.Red;
}
else if(文本==“通过”)
{
form.GridTestReport.Rows[form.GridTestReport.RowCount-1].DefaultCellStyle.ForeColor=Color.Green;
}
}
}

您不应仅使用多线程处理UI更新。UI始终只能在一个线程下工作。因此,如果您决定通过从不同线程更新UI来加快应用程序的速度,它将不起作用(因为这显然是不可能的,而且您的更新将排队在UI线程上执行)。对于某些真正的异步操作或某些CPU重载,应使用多个线程。如果您有大量UI更新,您可以使用一些计时器,例如,将一次性刷新所有UI更新,而不是N个小更改。例如,如果要向网格添加行,则可以冻结网格,添加所有新行,然后解冻it、

您不应该仅使用多线程处理UI更新。UI始终只能在一个线程下工作。因此,如果您决定通过从不同线程更新UI来加快应用程序的速度,它将不起作用(因为这显然是不可能的,而且您的更新将排队在UI线程上执行)。对于某些真正的异步操作或某些CPU重载,应使用多个线程。如果您有大量UI更新,您可以使用一些计时器,例如,将一次性刷新所有UI更新,而不是N个小更改。例如,如果要向网格添加行,则可以冻结网格,添加所有新行,然后解冻it、

看起来您应该使用单独的线程,
ThreadPool
只是一种方便的方法,可以完成一些轻量级的线程任务(在数量和质量上)。代码不足。请显示线程代码。@urs我添加了更多的代码看起来您应该使用单独的线程,
ThreadPool
只是一种方便的方法,可以完成一些轻量级的线程任务(在数量和质量上)。代码不足。请显示线程代码。@urs我添加了更多的代码。谢谢您的回答。我在最初的帖子中添加了更多的代码。我希望线程在调用refreshResult后立即退出。让它在特定的时间间隔后或在最后刷新,但在UI更新之前,它不应保持线程。@AnupD仍然存在此问题我不明白。首先,在你发布的代码中,没有任何东西在调用
refreshResult
。其次,真的有必要调用post数千次吗?我正在开发一个测试工具,它应该连续多次调用post方法。refreshResult在上面的代码中由Assert方法调用。@AnupD我明白了,那么它是有意义的。所以你呢你应该为实际作业使用线程,并使用一些计时器进行批量更新。否则它将无法顺利工作。谢谢你的回答。我在最初的帖子中添加了一些代码。我希望线程在调用refreshResult后立即退出。让它在特定的时间间隔后或在最后刷新,但它不应该将线程保留到UI更新了。@AnupD仍然有一些我不明白的地方。首先在代码中