在下面的示例中await,使用了两个调用.为了获得性能,样本会被转换Task.WaitAll()(实际上并不是更快,但这只是一个例子).
这是来自Android上使用Sqlite.Net的库中的代码,该方法从OnResume()主UI线程调用:
public async Task SetupDatabaseAsync()
{
await CreateTableAsync<Session>();
await CreateTableAsync<Speaker>();
}
Run Code Online (Sandbox Code Playgroud)
这是替代方案:
public void SetupDatabaseAsync()
{
var t1 = CreateTableAsync<Session>();
var t2 = CreateTableAsync<Speaker>();
Task.WaitAll(t1, t2);
}
Run Code Online (Sandbox Code Playgroud)
但是从我的理解Task.WaitAll()应该在等待时阻止UI线程,从而导致死锁.但它的工作正常.那是因为这两个调用实际上并没有在UI线程上调用任何东西吗?
如果我使用它有什么区别Task.WhenAll()?我猜它即使会调用UI线程也能工作,就像使用它一样await.
在我的应用程序中,所有图像,本地HTML页面等都标记为"构建操作内容".我刚刚意识到还有"资源".
我应该将哪一个用于图像,哪一个用于HTML页面在UIWebView中显示?
目前我使用这样的图像:
this.oImgLoginLogo.Image = UIImage.FromFile ( "Data/Images/ball.png" );
Run Code Online (Sandbox Code Playgroud)
但在Monotouch.Dialog中我看到这一行:
static UIImage arrow = Util.FromResource (null, "arrow.png");
Run Code Online (Sandbox Code Playgroud)
但是arrow.png也被标记为"内容"......?
困惑.
每种选择的不利/优势是什么?
在实现UIViewController包含时,在将一个子控制器与另一个子控制器交换时,我必须发送以下消息的正确顺序是什么?
它是如下,还是我的订单不正确?我错过了消息吗?
addChildViewController:addSubview:didMoveToParentViewController:removeFromSuperview::removeFromParentViewController::编辑: 我必须注意,上面只是你不使用UIViewController的转换方法而是想手动添加新视图的问题.
这将使我的iOS应用程序的文档根目录:
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
Run Code Online (Sandbox Code Playgroud)
是否有类似的东西进入Library文件夹?
将视图控制器推到时,如何获得自定义转换(iOS7)UINavigationController?我尝试TransitioningDelegate在UINavigationController我正在推动的控制器中设置两者.方法永远不会被调用.
我发现的所有示例在模态呈现时都使用自定义转换.
我正在使用下面的代码批量插入30000行(一次1000行).它仍然没有那么快.在这个例子中提高SQLite的INSERT每秒性能?我可以看到他们只创建了SqliteCommand一次,然后重新循环它重置它并清除绑定.但是,我无法在iOS/Monotouch上找到合适的方法.没有Reset()或ClearBindings()任何其他类似的东西.
using ( var oConn = new SqliteConnection ( "Data Source=" + DB_NAME ) )
{
oConn.Open ( );
// Wrap the whole bulk insertion into one block to make it faster, otherwise one transaction per INSERT would be created.
// Note that this is differen from "BEGIN TRANSACTION" which would increase memory usage a lot!
SqliteCommand oCmd = new SqliteCommand ( "BEGIN", oConn );
oCmd.ExecuteNonQuery ( );
oCmd.Dispose ( );
foreach …Run Code Online (Sandbox Code Playgroud) 我有INetwork一个方法的接口:
Task<bool> SendAsync(string messageToSend, CancellationToken ct)
Run Code Online (Sandbox Code Playgroud)
接口的一个实现具有如下代码:
public async Task<bool> SendAsync(string messageToSend, CancellationToken ct)
{
var udpClient = new UdpClient();
var data = Encoding.UTF8.GetBytes (messageToSend);
var sentBytes = await udpClient.SendAsync(data);
return sentBytes == data.Length;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,SendAsync()在中UdpClient类不接受CancellationToken.
所以我开始将其改为:
public Task<bool> SendAsync(string messageToSend, CancellationToken ct)
{
var udpClient = new UdpClient();
var data = Encoding.UTF8.GetBytes (messageToSend);
var sendTask = udpClient.SendAsync(data);
sendTask.Wait(ct);
if(sendTask.Status == RanToCompletion)
{
return sendTask.Result == data.Length;
}
}
Run Code Online (Sandbox Code Playgroud)
显然这不起作用,因为没有Task被退回.但是,如果我返回任务,则签名不再匹配. …
我正在使用HttpClient.PostAsync(),响应是一个HttpResponseMessage.其Content属性是HttpContent具有CopyToAsync()方法的类型.不幸的是,这是不可取消的.有没有办法将响应复制到a Stream并传递CancellationToken?
我没有被困住CopyToAsync()!如果有解决方法,那就没问题了.就像读取几个字节一样,检查是否取消,继续阅读等等.
这些HttpContent.CreateContentReadStreamAsync()方法看起来像是候选人.不幸的是,它不适用于我选择的个人资料.还不清楚它是否会一次性读取所有数据并浪费大量内存.
注意:我在PCL中使用这个目标是WP8,Windows Store 8,.NET 4.5,Xamarin.iOS和Xamarin.Android
我一直在iOS应用程序中使用最好的数据保护.这意味着我保存了所有文件,标记为"解锁时可用,仅此设备".那时候"刚刚工作".现在我发现创建App ID时有一个新设置(参见屏幕截图)我可以明确启用数据保护.
这就是我理解新选项的方式.有人可以确认一下吗?
NSFileManager?设置标志吗?
在转换应用程序为Android Oreo做好准备时,我JobIntentService 在这里阅读了文档.
在那里我发现(重要部分强调):
当作为pre-O服务运行时,正常的服务执行语义适用:[...]作为Job运行时,将应用典型的JobService执行时间限制,之后作业将被停止(干净地,不是通过查杀过程)并重新安排以后继续执行.
如果我查看记录的限制,就没有关于任何执行时间限制的说法.同时JobScheduler也没有提及任何东西.
c# ×5
xamarin.ios ×5
async-await ×3
ios ×3
xamarin ×3
cocoa-touch ×2
.net ×1
android ×1
asynchronous ×1
ios5 ×1
ios7 ×1
monodevelop ×1
service ×1
sqlite ×1