我想跑”SearchResultByOrderNumber(string orderNumber)
” 中的方法Foreach
与多线程。有十个订单号OrderNumbers
数据表。在搜索这些 OrderNumbers 时OrderResults
Datatable,我想把这些OrderNumber分成5个线程。在每个线程中都会有两次对 OrderNumbers 的搜索。如何使用 Asp.Net 3.5 Framework 执行此线程?
我想,我必须重新提出我的问题。
如何自动将“OrderNumbers”划分为异步方法?
首先,我得到了rowCount
。我将定义异步方法计数。然后我会得到rowsPerAsyncMethods
按划分rowCount
with asyncMethodCount
.
rowsPerAsyncMethods = rowCount / asyncMethodCount
谢谢。
void Main()
{
var MyTask1Caller = new Func<DataTable>(MyTask1);
var asyncResultMyTask1 = MyTask1Caller.BeginInvoke(null, null);
var MyTask2Caller = new Func<DataTable>(MyTask2);
var asyncResultMyTask2 = MyTask2Caller.BeginInvoke(null, null);
DataTable dtMyTask1 = MyTask1Caller.EndInvoke(asyncResultMyTask1);
DataTable dtMyTask2 = MyTask2Caller.EndInvoke(asyncResultMyTask2);
Console.WriteLine("dtMyTask1");
Console.WriteLine("dtMyTask2");
asyncResultMyTask1.AsyncWaitHandle.WaitOne();
asyncResultMyTask2.AsyncWaitHandle.WaitOne();
}
public int RowCount()
{
DataTable dt = OrderNumbers();
int items = dt.Rows.Count;
return items;
}
public DataTable MyTask1()
{
DataTable dtResult = new DataTable();
DataColumn dc = new DataColumn("OrderNumber", typeof(System.Int32));
dtResult.Columns.Add(dc);
dc = new DataColumn("OrderResult", typeof(string));
dtResult.Columns.Add(dc);
DataTable dtOrders = new DataTable();
dtOrders = OrderNumbers();
var items = dtOrders.AsEnumerable()
.Select(n => n).Take(3).CopyToDataTable();
foreach(var order in items.AsEnumerable())
{
string orderNumber = order["OrderNumber"].ToString();
string orderResult = SearchResultByOrderNumber(orderNumber);
DataRow dr = dtResult.NewRow();
dr["OrderNumber"] = orderNumber;
dr["OrderResult"] = orderResult;
dtResult.Rows.Add(dr);
}
//Thread.Sleep(5000);
return dtResult;
}
public DataTable MyTask2()
{
DataTable dtResult = new DataTable();
DataColumn dc = new DataColumn("OrderNumber", typeof(System.Int32));
dtResult.Columns.Add(dc);
dc = new DataColumn("OrderResult", typeof(string));
dtResult.Columns.Add(dc);
DataTable dtOrders = new DataTable();
dtOrders = OrderNumbers();
var items = dtOrders.AsEnumerable()
.Select(n => n).Skip(3).Take(3).CopyToDataTable();
foreach(var order in items.AsEnumerable())
{
string orderNumber = order["OrderNumber"].ToString();
string orderResult = SearchResultByOrderNumber(orderNumber);
DataRow dr = dtResult.NewRow();
dr["OrderNumber"] = orderNumber;
dr["OrderResult"] = orderResult;
dtResult.Rows.Add(dr);
}
return dtResult;
}
public string SearchResultByOrderNumber(string orderNumber)
{
DataTable dt = new DataTable();
dt = OrderResults();
var query = (from n in dt.AsEnumerable()
where n["OrderNumber"].ToString() ==orderNumber
select n["OrderResult" ].ToString()).FirstOrDefault();
return query;
}
public DataTable OrderResults()
{
DataTable dt = new DataTable("OrderResults");
DataColumn dc = new DataColumn("OrderNumber", typeof(System.Int32));
dt.Columns.Add(dc);
dc = new DataColumn("OrderResult", typeof(string));
dt.Columns.Add(dc);
for(int i=1; i<10; i++)
{
DataRow dr = dt.NewRow();
dr["OrderNumber"] = i;
dr["OrderResult"] =i +" Result";
dt.Rows.Add(dr);
}
return dt;
}
public DataTable OrderNumbers()
{
DataTable dt = new DataTable("OrderNumbers");
DataColumn dc = new DataColumn("OrderNumber", typeof(System.Int32));
dt.Columns.Add(dc);
for(int i=0; i<10; i++)
{
DataRow dr = dt.NewRow();
dr["OrderNumber"] = i;
dt.Rows.Add(dr);
}
return dt;
}
如果 .NET 4.0 可用,您只需使用 Parallel.ForEach 构造即可。
如果没有,并行处理就像使用ThreadPool
类,还有一些额外的同步工作:
int tasks = 0; // keep track of number of active tasks
object locker = new object(); // synchronization object
foreach(var order1 in dtOrders.AsEnumerable())
{
lock(locker) tasks++; // added a new task
var order = order1; // local copy to avoid data races
ThreadPool.QueueUserWorkItem(
o =>
{
string orderNumber = order["OrderNumber"].ToString();
string orderResult = SearchResultByOrderNumber(orderNumber);
DataRow dr = dtResult.NewRow();
dr["OrderNumber"] = orderNumber;
dr["OrderResult"] = orderResult;
lock(locker) // update shared data structure and signal termination
{
dtResult.Rows.Add(dr);
tasks--;
Monitor.Pulse(locker);
}
});
}
// barrier to wait for all tasks to finish
lock(locker)
{
while(tasks > 0) Monitor.Wait(locker);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)