我希望我的AsyncTask班级TextView从布局中更改a的可见性,但出现致命错误。如果我想获取的文本值TextView,它可以正常工作,但是在尝试设置可见性时会崩溃。
// Main Activity (MainActivity.java)
Context MainContext= getApplicationContext();
new MyAsyncTask((TextView)findViewById(R.id.my_text_view)).execute();
// My Async Task (MyAsyncTask.java)
public class MyAsyncTask extends AsyncTask <String, Void, String> {
private Context context;
private TextView my_text_view;
public MyAsyncTask (TextView my_text_view){
this.context = MainActivity.MainContext;
this.txt_loading = my_text_view;
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
my_text_view.setVisibility(View.VISIBLE); // crashes
Log.i("Value: ", String.valueOf(this.my_text_view.getText())); // O.K.!
return null;
}
@Override
protected void onPostExecute(String result) {
}
@Override
protected void onPreExecute() …Run Code Online (Sandbox Code Playgroud) 我正在尝试利用RavenDB的DocumentConvention API在我的域对象上自动设置增量ID.
我在IDocumentStore上使用这行代码完美地工作了:
DocumentStore.Conventions.RegisterIdConvention<User>
((dbname, commands, user) => "users/" + commands.NextIdentityFor("users"));
Run Code Online (Sandbox Code Playgroud)
每当我存储没有已设置ID的新User对象时,这将创建具有"users/1","users/2"等的用户对象的顺序ID .
但是,我想为Async文档会话执行此操作,但是在调用RegisterAsyncIdConvention()时无法找到有关如何从会话中获取"Next Identity"的任何文档...
docStore.Conventions.RegisterAsyncIdConvention<User>
((dbname, commands, user) => "users/" + commands.NextIdentityFor("users"));
Run Code Online (Sandbox Code Playgroud)
......不编译,因为NextIdentityFor不可用的IAsyncDatabaseCommands接口.
任何人都可以给我任何提示吗?还有人试过这个吗?
谢谢.
这是我尝试使用SendAsync()方法发送电子邮件.通过bool发送常规电子邮件时,它工作正常.使用SendAsync方法发送时没有骰子.如果你在这里看到错误,只是寻找一些提示.提前致谢.
private static void SendEmail(System.Net.Mail.MailMessage m, Boolean Async)
{
using (var smtpClient = new System.Net.Mail.SmtpClient(EmailList.SMTP_GOOGLE, 587))
{
smtpClient.EnableSsl = true;
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = new NetworkCredential("email@domain.com","password");
smtpClient.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
smtpClient.Timeout = 3000000;
if (Async)
{
object userState = m;
smtpClient.SendCompleted += new SendCompletedEventHandler(Smtp_OnComplete);
try
{
smtpClient.SendAsync(m, userState);
}
catch (Exception ex)
{
//Logging
}
}
else
{
try
{
smtpClient.Send(m);
}
catch (Exception ex)
//Logging
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我开始使用异步编程,我正在创建一个nodejs应用程序,我在一些文件中切片代码:index.js,ctlUser.js,DAO.js等... .. Index.js是它需要的主文件ctlUser和ctlUser需要DAO.js ... DAO连接数据库并执行查询...
抽象,我的结构是这样的......
Index.js
var ctlUser = require('./ctlUser.js');
var username = ctlUser.getUserName('1');
console.log("Return from ctlUser" + username);
Run Code Online (Sandbox Code Playgroud)
ctlUser.js
var DAO = require('./DAO.js');
var getUserName = function(id){
var userName = DAO.executeQuery("SELECT username FROM tbUsers WHERE id = " + id );
console.log(Return from DAO = userName);
return username;
}
Run Code Online (Sandbox Code Playgroud)
DAO.js在这里一切都很好......
var mysql = require('mysql');
var executeQuery = function(query) {
var connection = mysql.createConnection({
host : SERVER,
user : USER,
password : PASSWORD,
database : DATABASE
});
connection.connect();
connection.query(query, …Run Code Online (Sandbox Code Playgroud) 仅使用.net套接字作为示例,我使用:
TcpListener listener = new TcpListener(ip, port);
while(true)
{
TcpClient client = socket.AcceptTcpClient();
DoSomethingWithClient(client);
}
Run Code Online (Sandbox Code Playgroud)
但另一种方式似乎是(基于http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.beginaccepttcpclient.aspx):
public static ManualResetEvent tcpClientConnected = new ManualResetEvent(false);
public static void DoBeginAcceptTcpClient(TcpListener listener)
{
tcpClientConnected.Reset();
listener.BeginAcceptTcpClient(new AsyncCallback(DoAcceptTcpClientCallback), listener);
tcpClientConnected.WaitOne();
}
public static void DoAcceptTcpClientCallback(IAsyncResult ar)
{
TcpListener listener = (TcpListener) ar.AsyncState;
TcpClient client = listener.EndAcceptTcpClient(ar);
DoSomethingWithClient(client);
tcpClientConnected.Set();
}
Run Code Online (Sandbox Code Playgroud)
恕我直言,异步风格需要3倍的代码,看起来像goto spaghetti - 它难以阅读,并迫使你分离出相关的代码.那你为什么要使用异步方式呢?据推测它必须有一些优势?
我发现各种Deferred/promise库的文档通常涵盖非常简单的用例,例如链接1或2个函数/方法,并导致解决或拒绝成功或错误.
然而,当涉及到更复杂的用例(5个以上的函数/方法链;嵌套的Deferreds;从其他Deferreds中返回promise)时,我空手而归并变得非常沮丧.
比方说,我有一个包含2个嵌套函数的函数.每个子函数都返回一个promise,我希望父函数返回子函数的成功/失败结果:
var saveUser = function(user) {
var saveNewUser = function(user) {
var deferred = when.defer();
user.save(function (err) {
if (err) {
deferred.reject();
}
else {
// forcing a rejection here for testing purposes
deferred.reject(6);
}
});
return deferred.promise;
}
var supplyUserCollections = function() {
var deferred = when.defer();
deferred.reject();
return deferred.promise;
}
return saveNewUser(user).then(supplyUserCollections(), function() {
console.log('failed to save new user');
}).then(function(data) {
console.log('succeeded to do everything');
}, function() {
console.log('failed to seed new user collections');
});
} …Run Code Online (Sandbox Code Playgroud) 我有一个消耗Web API操作的异步方法.它似乎陷入了一个循环.我的理由是因为如果我在catch块的第1行放置一个断点,并且进入,它实际上从未击中第二行.
我最初返回一个包含100,000+(~30mb)行的数据集,并认为由于请求的大小,它可能会很慢,但在更改我的Web API操作以仅返回1行后问题仍然存在.当我浏览到Web API解决方案的URI时,肯定会返回数据,我在浏览器中返回了JSON.
public async Task<IEnumerable<Document>> GetAll()
{
try
{
var response = await _client.GetAsync(
string.Format("{0}/api/document", _baseURI));
// never hits line below
return await response.Content.ReadAsAsync<Document>()
as IEnumerable<Document>;
}
catch (Exception ex)
{
// handle exception
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定我在这里遗失了什么?一些帮助将不胜感激.
编辑1
在回答一些问题时,我有一个由MVC项目引用的Web API项目.我必须对JSON反序列化的原始问题进行一些更改.
库:
public async Task<IEnumerable<Document>> GetAll()
{
try
{
string json;
var response = await _client.GetAsync(string.Format(
"{0}/api/document", _baseURI)).ConfigureAwait(false);
var resource = await response.Content.ReadAsAsync<Document>();
using(var reader = new StreamReader(resource.ToString()))
{
json = reader.ReadToEndAsync().ToString();
}
return JsonConvert.DeserializeObjectAsync<Document>(json)
as IEnumerable<Document>;
} …Run Code Online (Sandbox Code Playgroud) 我创建了一个锁对象包装器(类),它使用semaphoreSlim(1)作为我的管理器(类)操作的锁机制.
我的经理类包含一个锁,我在构造新的包装类时发送,然后我在这个包装类锁上使用Await(实际上等待我在构造时发送它的锁).并在Dispose上释放它(包装类的目的是自动锁定和释放,锁定构造,并在处置时释放).
我将这种模式用于我构建的新锁包装:
//_syncLock is a class that used as member lock to use in my operations as async lock.
using (OperationSyncLockWrapper syncLock = new OperationSyncLockWrapper(_syncLock))
{
await syncLock.Wait(); //I wish to avoid this line and run it automatically
await SomeAsyncOperation(parameter1);
}
Run Code Online (Sandbox Code Playgroud)
因为我不能在构造函数方法中使用async/await.还有另一种方法可以等待我刚创建的新对象 - 在类构造上还是之后?
我有一个带有几个选项卡的WPF表单.当我加载表单时,我也尝试在后台加载一些数据选项卡.
代码如下所示:
public static List<MyModel> GetCaseNotes(int someId)
{
return GetCaseNotesAsync(debtorId).Result;
}
public static async Task<List<MyModel>> GetCaseNotesAsync(int someId)
{
Task<List<MyModel>> tsk = Task.Run(() => GetCaseNotesFromDb(someId));
return await tsk.ConfigureAwait(false);
}
public static List<MyModel> GetCaseNotesFromDb(int debtorId)
{
//get some data from database
}
Run Code Online (Sandbox Code Playgroud)
但是,UI仍在等待从数据库中获取数据......有什么想法吗?
我尝试了很多在nodejs中使用aync库,但我最简单的测试甚至不起作用.
var async = require('async');
var i = 0 ;
var inc = function(){
i++;
} ;
var show = function(){
console.log(i) ;
} ;
var err = function(err){
console.log(err) ;
} ;
async.forever(inc,err) ;
async.forever(show,err) ;
Run Code Online (Sandbox Code Playgroud)
函数根本不循环,输出只是
1
Run Code Online (Sandbox Code Playgroud)
请问我做错了什么.
asynchronous ×10
c# ×5
async-await ×3
node.js ×3
javascript ×2
.net ×1
android ×1
asp.net ×1
asp.net-mvc ×1
callback ×1
email ×1
promise ×1
ravendb ×1
show ×1
task ×1
textview ×1