首先,我是多线程或多任务处理的新手,但我正在努力工作。我试图以两种不同的方式搜索SQL数据库:第一个搜索中点以下的ID,第二个搜索中点以上的ID。我想同时运行两个搜索;该程序有效,但当我在任务管理器中检查时,所有搜索都在一个核心上运行。
我无法弄清楚如何解决这个问题。这是我的代码;你能帮助我吗?
public int SearchForTweetSqlID(string TweetID, string TempQuery, int MidPoint)
{
int ResultSmallSearch = 0;
int ResultBigSearch = 0;
Parallel.Invoke(() => ResultSmallSearch = TaskSearchSqlTweetID(TweetID, TempQuery, MidPoint, true).Result,
() => ResultBigSearch = TaskSearchSqlTweetID(TweetID, TempQuery, MidPoint, false).Result
);
int TweetSqlID = 0;
if (ResultSmallSearch != 0)
{
TweetSqlID = ResultSmallSearch;
}
if (ResultBigSearch != 0)
{
TweetSqlID = ResultBigSearch;
}
return TweetSqlID;
}
public async Task<int> TaskSearchSqlTweetID(string TweetID, string Query, int Midpoint, bool way)
{
SqlConnection conn = new SqlConnection(Tools.ConnectionString);
SqlCommand comm = new SqlCommand();
if (way == true)
{
comm = new SqlCommand("select * from Tweets where @VsTweetID=TweetID and ID>@VsMidPoint", conn);
}
else
{
comm = new SqlCommand("select * from Tweets where @VsTweetID=TweetID and ID<@VsMidPoint", conn);
}
comm.Parameters.AddWithValue("@VsTweetID", TweetID);
comm.Parameters.AddWithValue("@vsMidPoint", Midpoint);
if (conn.State == ConnectionState.Closed) conn.Open();
SqlDataReader dr = comm.ExecuteReader();
Tweets Gidecek = new Tweets();
if (dr.HasRows)
{
while (dr.Read())
{
Gidecek.ID = dr.GetInt32(0);
}
dr.Close();
conn.Close();
int sonuc = await Task<int>.FromResult(Gidecek.ID);
return sonuc;
}
else
{
dr.Close();
conn.Close();
int sonuc = await Task<int>.FromResult(0);
return sonuc;
}
}
答案 0 :(得分:1)
首先,您无法从托管代码中为线程指定核心。托管代码的基本概念是所有内存,线程等任务都由VM和OS管理。
第二件事是你不会使用我看到的代码对SQL进行任何优化,因为SQL查询在SQL服务器上运行,而不是在代码中运行。