.net 在C+;中的windows应用程序窗体内使用while循环时重复索引+。网

.net 在C+;中的windows应用程序窗体内使用while循环时重复索引+。网,.net,c++-cli,.net,C++ Cli,(更新了代码)我正在尝试开发一个GUI,显示5个不同功能的结果。所有函数都从for循环获得相同的输入,但并行运行任务以显示结果。结果似乎很奇怪。而不是显示1,2,3,4,5。。。我得到1,1,3,4,4 int main(array<System::String ^> ^args) { Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); Applic

(更新了代码)我正在尝试开发一个GUI,显示5个不同功能的结果。所有函数都从for循环获得相同的输入,但并行运行任务以显示结果。结果似乎很奇怪。而不是显示1,2,3,4,5。。。我得到1,1,3,4,4

int main(array<System::String ^> ^args)
{   
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false); 
Application::Run(gcnew mainform());
return 0;
}
bool flag;
public ref class mainform : public System::Windows::Forms::Form
{
public:
mainform(void)
{
 InitializeComponent();
}
public:typedef Tuple<int, CancellationToken> tuple_t;
private:
System::Void btnStart_Click(System::Object^ sender, System::EventArgs^ e)
{
int i=0;
while (i < max) {
    auto tuple = gcnew tuple_t(i,CancellationToken);
    task1 = gcnew Task(gcnew Action<Object^(this,mainform::opera1),tuple,CancellationToken);                      
    task1->start(); 
    task1->ConfigureAwait(flag); 
    flag=false; 
    i++;
}
}
public: delegate void add_row_item_det(int data,  int output, DataGridView^ dataGrid);
public: void update_add_row_item_det(int data,  int output,  DataGridView ^dataGrid)
{
    array<String^> ^row = gcnew array<String^> {Convert::ToString(data), Convert::ToString(output)};
    dataGrid->Rows->Insert(0,row);
    dataGrid->Refresh();
}
void opera1(Object^ state)
{
auto tuple = static_cast<tuple_t^>(state);
int data = tuple->Item1;    
CancellationToken token = tuple->Item2;
dataGrid->Invoke(gcnew add_row_item_det(this,&mainWindow::update_add_row_item_det),data,output_data, dataGrid);                             
flag=true;
}
};
int main(数组^args)
{   
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
应用程序::运行(gcnewmainform());
返回0;
}
布尔旗;
public ref类mainform:public System::Windows::Forms::Forms
{
公众:
主表格(作废)
{
初始化组件();
}
public:typedef Tuple Tuple\t;
私人:
系统::Void btnStart\u单击(系统::对象^sender,系统::事件参数^e)
{
int i=0;
而(iConfigureAwait(标志);
flag=false;
i++;
}
}
public:委托void add_row_item_det(int数据、int输出、DataGridView^dataGrid);
public:void update\u add\u row\u item\u det(整型数据、整型输出、DataGridView^dataGrid)
{
数组^row=gcnew数组{Convert::ToString(数据),Convert::ToString(输出)};
数据网格->行->插入(0,行);
dataGrid->Refresh();
}
无效操作1(对象^state)
{
自动元组=静态转换(状态);
int data=tuple->Item1;
CancellationToken=元组->项2;
dataGrid->Invoke(gcnew add_row_item_det(this,&main窗口::update_add_row_item_det)、data、output_data、dataGrid);
flag=true;
}
};
我期待歌剧的产出 1,out1(1) 2,out1(2) 3,out1(3) 4,out1(4)

但结果是 1,out1(1) 1,out1(1) 3,out1(3) 4,out1(4)

为什么我在应用程序中使用while循环时会得到重复索引?有什么方法可以让它像我期望的那样工作吗?请帮我举个例子


%附加注释:这是我实际代码的副本。我正在尝试打印while循环中的整数,并将并行任务中的整数输出对应到datagrid框中。打印的整数不是串联的。我可以看到几个重复的整数和几个丢失的整数。为什么会出现此问题?如何解决此问题lem?请帮我举个例子。谢谢你的帮助

我怀疑
I
是通过引用传递的。我们需要看看
tuple\t
是如何定义的(它是什么别名,更重要的是,第一个模板参数的类型是什么?)。看看你们是怎么打印的也很好。
tuple\u t
的第一个参数是否定义为
int%
?若不是,请发布一些真实的代码。显然你们的tuple\u t坏了,用
tuple
代替。大家好,我发布了我实际问题的副本作为答案。请帮助我解决这个问题。@all:::Th这是我如何定义tuple_t:public:typedef tuple tuple_t;