最近在接受采访时,我得到了这个问题.
问:您是否编写过多线程应用程序?
答:是的
问:关心解释更多?
答:我用Tasks(任务并行库)来执行一些任务waiting for some info from internet while loading UI.这提高了我的应用程序可用性.
问:但是,您是否已经使用过TPL手段来编写multithreaded应用程序?
我:(不知道该说些什么1)
那么,什么是多线程应用程序呢?它与使用不同Tasks吗?
c# multithreading .net-4.0 multitasking task-parallel-library
我试图使用async/wait .NET功能进行Oracle查询.结果集非常大,需要大约5-10秒才能恢复.Window_Loaded挂起了UI线程,本质上我想使用async/wait在后台进行查询,然后使用结果更新数据视图.
这是Oracle驱动程序问题还是代码错误?例如,这是同步而不是异步完成的事情吗?我正在使用Oracle.ManagedDataAccessOracle可以从Oracle网站获得的最新信息.
async Task<DataTable> AccessOracleAsync()
{
DataTable dt;
using(OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString))
using (OracleCommand cmd = new OracleCommand(@"SELECT * FROM myTbl", conn))
{
await conn.OpenAsync();
using (var reader = await cmd.ExecuteReaderAsync())
{
dt = new DataTable();
dt.Load(reader);
}
}
return dt;
}
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
await AccessOracleAsync();
}
Run Code Online (Sandbox Code Playgroud)
我试过这个,它仍然在用户界面陷入僵局:
async Task<DataView> AccessOracleAsync()
{
DataTable dt;
using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["connStr"].ConnectionString))
using (OracleCommand cmd = new OracleCommand(@"SELECT * FROM myTbl", conn)) …Run Code Online (Sandbox Code Playgroud) 我有一个从多个MessageQueue实例读取的Windows服务.这些消息队列都有自己Task的阅读消息.通常,在阅读消息后,I/O数据库的工作就完成了.我发现文章声称在I/O操作上使用异步是个好主意,因为它可以释放线程.我正在尝试模拟在控制台应用程序中使用异步I/O操作的性能提升.
在我的测试环境中,我有10个队列.GetQueues()返回10个不同的MessageQueue实例.
static void Main(string[] args)
{
var isAsync = Console.ReadLine() == "Y";
foreach (var queue in queueManager.GetQueues())
{
var temp = queue;
Task.Run(() => ReceiveMessagesForQueue(temp, isAsync));
}
while (true)
{
FillAllQueuesWithMessages();
ResetAndStartStopWatch();
while(!AllMessagesRead())
{
Thread.Sleep(10);
}
Console.WriteLine("All messages read in {0}ms", stopWatch.ElapsedMilliseconds);
}
}
static async Task ReceiveMessagesForQueue(MessageQueue queue, bool isAsync)
{
while (true)
{
var message = await Task.Factory.FromAsync<Message>(queue.BeginReceive(), queue.EndReceive);
if (isAsync)
await ProcessMessageAsync(message);
else
ProcessMessage(message);
}
}
Run Code Online (Sandbox Code Playgroud)
c# performance-testing task-parallel-library async-await c#-5.0
我正在尝试使用异步和等待.NET Framework 4.5中提供的功能执行多个数据库调用.这是我第一次实现此功能.
如果每个查询花费7秒,则过去需要35秒(5个查询*7秒).通过以下实现,我期待它应该在接近7-9秒的时间内在asp页面中获取和填充控件.但是,它仍然需要35秒,证明了我的同步行为.
有人可以帮助我在下面的异步实现中出错.
我对任何投入表示赞赏,因为几天以来我一直在为此而烦恼
protected void Page_Load(object sender, System.EventArgs e)
{
RegisterAsyncTask(new PageAsyncTask(FillControlsAsync));
}
public async Task FillControlsAsync()
{
Task[] tasks = new Task[]{
PopulateControlTask(query1, "controlID1"),
PopulateControlTask(query2, "controlID2"),
PopulateControlTask(query3, "controlID3"),
PopulateControlTask(query4, "controlID4"),
PopulateControlTask(query5, "controlID5")
});
await Task.WhenAll(tasks);
}
public async Task PopulateControlTask(string query, string control)
{
await Task.Run(() =>
{
DataSet ds;
OracleCommand cmd;
OracleDataAdapter da;
try
{
if (!Page.IsPostBack)
{
cmd = new OracleCommand(query, cn);
da = new OracleDataAdapter(cmd);
ds = new DataSet();
da.Fill(ds);
switch (control)
{ …Run Code Online (Sandbox Code Playgroud) c# ×4
async-await ×3
.net ×1
.net-4.0 ×1
ado.net ×1
asp.net ×1
c#-5.0 ×1
multitasking ×1
oracle ×1
webforms ×1